{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "## 任务要求：提取新闻中人物观点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 利用sqlalchemy来访问数据库数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sqlalchemy import Column, String, create_engine,Integer,Text\n",
    "from sqlalchemy.orm import sessionmaker\n",
    "from sqlalchemy.ext.declarative import declarative_base\n",
    "from sqlalchemy.sql import select"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 由于MySQL服务器以独立的进程运行，并通过网络对外服务，所以，需要支持Python的MySQL驱动来连接到MySQL服务器。\n",
    "- 目前，有两个MySQL驱动：\n",
    "  1. mysql-connector-python：是MySQL官方的纯Python驱动\n",
    "  2. MySQL-python：是封装了MySQL C驱动的Python驱动"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pymysql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "Text??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "conn = pymysql.connect(    \n",
    "    host = 'rm-8vbwj6507z6465505ro.mysql.zhangbei.rds.aliyuncs.com',\n",
    "    user = 'root',\n",
    "    password = 'AI@2019@ai',\n",
    "    db = 'stu_db',\n",
    "    charset='utf8'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "random.randint()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 654,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "叶盛茂被控隐匿公文案首次开审中新网9月15日电 台当局前“调查局长”叶盛茂被控隐匿公文案，台北地方法院今天首度开庭审理，并传讯相关证人，厘清情资公文被核定为机密的作业过程。叶盛茂在步入法庭前答复媒体表示，他在交付情资给陈水扁时，现场并无第三人在场。据“中央社”报道，叶盛茂被控将今年1月间艾格蒙联盟通报关于陈水扁家庭疑似海外洗钱情资公文，未依法给“最高检察署”，事后该份公文正本下落不明，遭台北地检署以隐匿公文罪起诉，并求刑两年半。叶盛茂被起诉后举行记者会，声称他是利用例行晋见陈水扁的会议，把公文交给陈水扁，但陈水扁只承认收过“调查局长”的情资报告，没有公文；此部分另外衍生是否泄密的问题，仍由北检侦办中。由于有媒体披露叶盛茂将公文交给陈水扁时，有第三人在场，叶盛茂今天被媒体问到相关问题时连以“没有这回事、没人在场”，予以否认。起诉书指遗失的公文属“极机密”文件，法院合议庭今天开庭要厘清这份情资公文是否属“机密保护法”规定的“极机密”密件，因为“依机密保护法”规定，叶盛茂并无核定极机密的权限。法院今天也传唤当时承办这份公文的“调查局”洗钱防制中心主任周有义及承办人邹求强。\n",
      "########## (21, 23)\n"
     ]
    }
   ],
   "source": [
    "rnd = random.randint(21000,24000)\n",
    "sql = \"select content from news_chinese_01 where id=\"+str(rnd)\n",
    "cur = conn.cursor()\n",
    "cur.execute(sql)\n",
    "ss = cur.fetchall()[0][0].replace('\\\\n','')\n",
    "print(ss)\n",
    "\n",
    "title = ss.find('乐讯')\n",
    "for flag in ('乐讯','报讯','快讯','技讯','日电','日讯','(组图)', '(图)','（组图）','（图）'):\n",
    "    title =  ss.find(flag)\n",
    "    if title != -1:\n",
    "        title = (title, title+len(flag))\n",
    "        break\n",
    "if title ==-1:\n",
    "    title = re.search('[\\(（]\\w*?记者.*?[\\)）]', ss)\n",
    "    if title:\n",
    "        title =title.span()\n",
    "    else:\n",
    "        title = -1\n",
    "print('##########',title)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 568,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n"
     ]
    }
   ],
   "source": [
    "if title:\n",
    "    print(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 581,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "女子小区内驾车连撞6位居民\n",
      "早报记者 李淑平昨日下午5时许，在杨浦区开鲁路286弄的居民小区发生一起车撞人事故。一女车主驾驶别克车进露天车位时猛然加速，致使6位居民不同程度受伤，幸好均无生命危险。现在事故原因还在进一步调查中。 车离宝宝只有20厘米昨日下午6时20分许，记者赶到该小区看到，小区里面距大门20多米处有个杂货店，它隔壁有白线标出来的三个停车位，据乘凉的居民说刚刚的车祸就发生在这个杂货店门口。杂货店老板陈女士回忆说，昨日下午5时许，趁着天气凉爽，小区居民又像往常一样来杂货店旁乘凉、聊天，她在店门口铺了纸板，让刚刚1岁的儿子在纸板上爬。这时就听到“砰”、“砰”的撞击声，抬头一看，一部银色的小轿车在撞倒两个人后冲着乘凉的人群冲过来，又连撞4人才把车刹住。一个老太被压在车底，其余几个人或躺或趴在地上。她吓得呆在那不知所措，“幸亏我公公把宝宝往后拖了一下，不然他就没命了，车离宝宝只有20厘米的距离啊。”到现在还惊魂未定的陈女士，连呼刚才像看惊险电影一样。56岁的秦阿姨就没有宝宝那么幸运了，记者随后赶到长海医院急诊楼看到，秦阿姨正躺在外科急诊室挂吊瓶，上衣腹部上面是清晰的车轮印。据秦阿姨回忆，她当时是要到杂货店买东西，感觉像有人在后面推了自己一把，她一个踉跄倒在地上，随后那个轿车前车轮从她肚子上压过。她当时给吓得大脑一片空白，都不知自己是否还活着，直到被120救护人员送到医院紧急救治，才感觉到浑身酸痛。另一位伤势比较重的是50岁的王阿姨，当时被车撞倒后，额头着地，现在还在等待医生的进一步检查。另外被撞的一男一女身上多处挫伤。伤势最轻的是一个老伯，据目击居民说，当时他从地上爬起来，发现自己没受重伤，拍了拍身上的土，就一瘸一拐走开了。车主平时开车就很“猛”据居民王阿婆说，肇事女车主大概40多岁，开一辆银色别克车，她的停车位就在杂货店隔壁第一个。平时看她开车就很“猛”，进出车位都是急开急停。有一次，几个居民在杂货店旁边洗衣服，该车主从车位上开车出门，眼看着她的车不走大路，倒冲着水桶过来，硬是把水桶撞飞，把洗衣服的人吓个目瞪口呆。居民张先生说，大概是女车主错把油门当刹车踩，才会让车子突然加速撞到人。“这个车是怎么练的？这种技术也能开车上路，真是太不靠谱了。”车子撞人后，肇事车主被赶来的110民警带走，事故原因还在调查中。\n"
     ]
    }
   ],
   "source": [
    "print(ss[:title[0]])\n",
    "print(ss[title[1]:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 576,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9\n"
     ]
    }
   ],
   "source": [
    "title = sss.find('紧张')\n",
    "if title == -1:\n",
    "    title = sss.find('报讯')\n",
    "print(title)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 575,
   "metadata": {},
   "outputs": [],
   "source": [
    "sss = '''潘长江坦言上春晚仍紧张 郭弛《地下的天空》曼谷电影（央视记者曾焕阳 通讯员蓝悦、陈振敏）节震撼观众(图)国际在线专：\n",
    "            或制造大冷新浪体育讯\n",
    "            (21000,24000)\n",
    "            (30000,33000)\n",
    "            东源讯（记者曾焕阳 通讯员蓝悦、陈振敏）\n",
    "            (记者李铁铮 通讯员郭斌)\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 578,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'潘长江坦言上春晚仍'"
      ]
     },
     "execution_count": 578,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sss[:9]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 537,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 552,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "26"
      ]
     },
     "execution_count": 552,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "title = re.search('[\\(（]',sss)\n",
    "title.span()[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 543,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<_sre.SRE_Match object; span=(25, 44), match='（央视记者曾焕阳 通讯员蓝悦、陈振敏）'>"
      ]
     },
     "execution_count": 543,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "title = re.search('[\\(（]\\w*?记者.*?[\\)）]', sss)\n",
    "title"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 544,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'节震撼观众(图)国际在线专：\\n            或制造大冷新浪体育讯\\n            (21000,24000)\\n            (30000,33000)\\n            东源讯（记者曾焕阳 通讯员蓝悦、陈振敏）\\n            (记者李铁铮 通讯员郭斌)\\n'"
      ]
     },
     "execution_count": 544,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sss[44:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ss.find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "connection = engine.connect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "137 ms ± 4.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit\n",
    "id_list = connection.execute(sql)\n",
    "#print(id_list.fetchall())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "passward = 'AI@2019@ai'\n",
    "host = 'rm-8vbwj6507z6465505ro.mysql.zhangbei.rds.aliyuncs.com'\n",
    "user = 'root'\n",
    "post = '3306'\n",
    "database = 'stu_db'\n",
    "engine= create_engine(\"mysql+mysqlconnector://{}:{}@{}:{}/{}\".format(user,passward,host,post,database))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'mysql+mysqlconnector://root:AI@2019@ai@rm-8vbwj6507z6465505ro.mysql.zhangbei.rds.aliyuncs.com:3306/stu_db'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"mysql+mysqlconnector://{}:{}@{}:{}/{}\".format(user,passward,host,post,database)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据库查询语句：\n",
    "\n",
    "- show tables;   -- 查看当前数据库中所有表\n",
    "- show create table MyClass; --查看创建时候表语句\n",
    "- desc xxxxx;  --查看xxxxx表结构\n",
    "\n",
    "推荐逐条查询：\n",
    "ids =  XXXX.execute(\"select id from XXXX\"); \n",
    "for i in ids:\n",
    "    obj = XXXX.get(id)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "connection = engine.connect()\n",
    "#result = connection.execute(\"select author, content from news_chinese\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "id_list = connection.execute(\"select id from news_chinese\")\n",
    "id_list = id_list.fetchall()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "i=0\n",
    "for _id in id_list:\n",
    "    i += 1 \n",
    "    if i>10: break\n",
    "    text = list(connection.execute(\"select content from news_chinese where id={}\".format(_id[0])))\n",
    "    #print(text[0][0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "passward = 'AI@2019@ai'\n",
    "host = 'rm-8vbwj6507z6465505ro.mysql.zhangbei.rds.aliyuncs.com'\n",
    "user = 'root'\n",
    "post = '3306'\n",
    "database = 'stu_db'\n",
    "engine= create_engine(\"mysql+mysqlconnector://{}:{}@{}:{}/{}\".format(user,passward,host,post,database))\n",
    "DBSession = sessionmaker(bind=engine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "passward = 'forever'\n",
    "host = '127.0.0.1'\n",
    "user = 'root'\n",
    "post = '3306'\n",
    "database = 'flask_study'\n",
    "engine= create_engine(\"mysql+mysqlconnector://{}:{}@{}:{}/{}\".format(user,passward,host,post,database))\n",
    "DBSession = sessionmaker(bind=engine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "Base = declarative_base()\n",
    "class News(Base):\n",
    "    \"\"\"用户表\"\"\"\n",
    "    __tablename__ = \"news_chinese_01\"  # 指明数据库的表名\n",
    "    id = Column(Integer, primary_key=True)  # 整型的主键，会默认设置为自增主键\n",
    "    name = Column(String(64))\n",
    "    content = Column(Text(30000))\n",
    "        # 添加配置设置编码\n",
    "    __table_args__ = {\n",
    "        'mysql_charset':'utf8'\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Base.metadata.drop_all(engine)\n",
    "Base.metadata.create_all(engine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建session对象:\n",
    "session = DBSession()\n",
    "# 创建新User对象:\n",
    "new_user = News(name='Bob',content='dasdasdasdasdasdad')\n",
    "# 添加到session:\n",
    "session.add(new_user)\n",
    "# 提交即保存到数据库:\n",
    "session.commit()\n",
    "# 关闭session:\n",
    "session.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "news_path = 'E:/MYGIT/DataSources/THUCNews/news_origin'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "体育新闻\n",
      "娱乐新闻\n",
      "家居新闻\n",
      "彩票新闻\n",
      "房产新闻\n",
      "教育新闻\n",
      "时尚新闻\n",
      "时政新闻\n",
      "星座新闻\n",
      "游戏新闻\n",
      "社会新闻\n",
      "科技新闻\n",
      "股票新闻\n",
      "财经新闻\n"
     ]
    }
   ],
   "source": [
    "session = DBSession()\n",
    "path_dir = os.listdir(news_path)\n",
    "for path in path_dir:\n",
    "    name  = str(path[:4])\n",
    "    print(name)\n",
    "    with open(os.path.join(news_path, path), encoding='utf-8') as f:\n",
    "        for i in range(3000):\n",
    "            line = f.readline()\n",
    "            if line =='':break\n",
    "            content = str(line.strip())\n",
    "            new_news = News(name=name,content=content)\n",
    "            session.add(new_news)\n",
    "    session.commit()\n",
    "session.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'体育新闻'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_path[0][:4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取数据中所有和说相关的单词"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 建立Word2Vec模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Word2Vec模型用于来获取和说相关的所有单词\n",
    "\n",
    "关于Word2Vec模型应该使用什么语料库来建立？？先试验以下两个语料库。不对停用词处理，因为和说相关的词有可能在停用词里面，或者对现有停用词库进行处理，把说相关的去除掉\n",
    "- 维基百科语料库\n",
    "- THUCNews新闻"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Wiki百科数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data_path = \"your_data_path\"\n",
    "stop_word_path = 'stopwords.txt'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import re\n",
    "import jieba\n",
    "import multiprocessing as mp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#file_list = os.listdir(train_data_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "code_folding": [
     8,
     25
    ]
   },
   "outputs": [],
   "source": [
    "def get_stop_word(stop_word_path):   \n",
    "    stop_word_list = []\n",
    "    with open(stop_word_path) as f:\n",
    "        #330后包括了一些词的停用词，故不用\n",
    "        for i in range(350):\n",
    "            stop_word_list.append(f.readline().strip('\\n'))\n",
    "    return stop_word_list\n",
    "\n",
    "def cut_process(input_file,output_file,stop_word_path):\n",
    "    output = open(output_file, 'w', encoding='utf-8')\n",
    "    ff = open(input_file,encoding='utf-8')\n",
    "    content_line = ff.readline() \n",
    "    stopwords = get_stop_word(stop_word_path)\n",
    "    article_contents = ''\n",
    "    while content_line != '':\n",
    "        if content_line.startswith('<doc id'):\n",
    "            #print(content_line)\n",
    "            article_contents = ''\n",
    "            content_line = ff.readline()\n",
    "            content_line = ff.readline()\n",
    "\n",
    "        if content_line.startswith('</doc>'):\n",
    "            words = jieba.cut(article_contents,cut_all=False)\n",
    "            content = ''\n",
    "            for word in words:\n",
    "                if word not in stopwords:\n",
    "                    content += word + ' '\n",
    "            output.write(content+\"\\n\") #每篇文章内容用换行符分隔          \n",
    "        article_contents += content_line.strip('\\n')  \n",
    "        content_line = ff.readline() \n",
    "    ff.close()\n",
    "    output.close()\n",
    "#多进程并行处理，加快速度 \n",
    "def multi_deal_file(inputfile, outputfile):\n",
    "    file_list = os.listdir(inputfile)\n",
    "    pool = mp.Pool()\n",
    "    arg_list = []\n",
    "    for file in file_list:\n",
    "        if file.endswith('new'):\n",
    "            arg_list.append((os.path.join(inputfile, file),\\\n",
    "                            os.path.join(outputfile, file),'stopwords.txt'))\n",
    "\n",
    "    for arg in arg_list:\n",
    "        print(arg)\n",
    "        pool.apply_async(cut_process, args=arg)\n",
    "\n",
    "    pool.close()\n",
    "    pool.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "inputfile = r'E:\\MYGIT\\Word2Vec\\wikiextractor-master\\zhwiki\\AA\\new'\n",
    "outputfile = r'E:\\MYGIT\\Word2Vec\\wikiextractor-master\\zhwiki\\AA\\new_split'\n",
    "#multi_deal_file(inputfile,outputfile)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "multi_deal_file(inputfile,outputfile)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def merge_file(inputpath):\n",
    "    file_list = os.listdir(inputpath)\n",
    "    with open(os.path.join(inputpath,'new_result'), 'a',encoding='utf-8') as output:\n",
    "        for file in file_list:\n",
    "            print(\"Now deal with \"+ file)\n",
    "            with open(os.path.join(inputpath,file),encoding='utf-8') as origin:\n",
    "                line_str = origin.readline()\n",
    "                while line_str != '':\n",
    "                    output.write(line_str)\n",
    "                    line_str = origin.readline()\n",
    "                output.write('\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Now deal with wiki_00_new\n",
      "Now deal with wiki_01_new\n",
      "Now deal with wiki_02_new\n",
      "Now deal with wiki_03_new\n",
      "Now deal with wiki_04_new\n",
      "Now deal with wiki_08_new\n",
      "Now deal with wiki_09_new\n"
     ]
    }
   ],
   "source": [
    "merge_file(outputfile)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "#### THUCNews新浪新闻数据处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "预处理新浪新闻数据·"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "code_folding": [
     0,
     8,
     32
    ],
    "hidden": true
   },
   "outputs": [],
   "source": [
    "def get_stop_word(stop_word_path):   \n",
    "    stop_word_list = []\n",
    "    with open(stop_word_path) as f:\n",
    "        #330后包括了一些词的停用词，故不用\n",
    "        for i in range(350):\n",
    "            stop_word_list.append(f.readline().strip('\\n'))\n",
    "    return stop_word_list\n",
    "\n",
    "def pre_data_deal(folder):\n",
    "    stopwords = get_stop_word('stopwords.txt')\n",
    "    file_list = os.listdir(folder)\n",
    "    save_path = os.path.join(folder,folder+'新闻.txt')\n",
    "    with open(save_path, 'w', encoding='utf-8') as output:\n",
    "        i = 0\n",
    "        for file in file_list:\n",
    "            i += 1\n",
    "            if (i%1000==0):print(\"Now deal with\"+ folder + '{}'.format(i))\n",
    "            file_path = os.path.join(folder,file)\n",
    "            with open(file_path, encoding='utf-8') as f:\n",
    "                line = f.readline()\n",
    "                text = ''\n",
    "                while line!='':\n",
    "                    text += line.strip('\\n')\n",
    "                    line = f.readline()\n",
    "                text = text.replace(' ','')\n",
    "                words = jieba.cut(text)\n",
    "                text_split = ''\n",
    "                for word in words:\n",
    "                    if word not in stopwords:\n",
    "                        text_split += word+ ' '\n",
    "                output.write(text_split+'\\n')\n",
    "                \n",
    "def multi_deal_file_1(inputfile):\n",
    "    file_list = os.listdir(inputfile)\n",
    "    pool = mp.Pool()\n",
    "    arg_list = []\n",
    "    for file in file_list:\n",
    "            arg_list.append((os.path.join(inputfile, file),))\n",
    "\n",
    "    for arg in arg_list:\n",
    "        print(arg)\n",
    "        pool.apply_async(pre_data_deal, args=arg)\n",
    "\n",
    "    pool.close()\n",
    "    pool.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "inputfile = r'F:\\Download\\THUCNews\\THUCNews'\n",
    "#multi_deal_file_1(inputfile)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "#### 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "from gensim.models import word2vec\n",
    "from gensim.models import Word2Vec\n",
    "from gensim.models.word2vec import LineSentence\n",
    "import os\n",
    "import logging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "def merge_file(inputpath):\n",
    "    file_list = os.listdir(inputpath)\n",
    "    with open(os.path.join(inputpath,'new_result'), 'a',encoding='utf-8') as output:\n",
    "        for file in file_list:\n",
    "            print(\"Now deal with \"+ file)\n",
    "            with open(os.path.join(inputpath,file),encoding='utf-8') as origin:\n",
    "                line_str = origin.readline()\n",
    "                while line_str != '':\n",
    "                    output.write(line_str)\n",
    "                    line_str = origin.readline()\n",
    "                output.write('\\n')\n",
    "                \n",
    "def start_train(input_folder_path):    \n",
    "    logging.basicConfig(format=\"%(asctime)s:%(levelname)s:%(message)s\",level=logging.INFO)  \n",
    "    train_file_list = os.listdir(input_folder_path)\n",
    "    if len(train_file_list) > 1:\n",
    "        merge_file(input_folder_path)\n",
    "        train_file_path = os.path.join(input_folder_path, 'new_result')\n",
    "    else:\n",
    "        train_file_path = os.path.join(input_folder_path,train_file_list[0])\n",
    "        \n",
    "    sentences = LineSentence(train_file_path)\n",
    "    model = Word2Vec(sentences, size=300, window=5, min_count=2, workers=8, sg =1)\n",
    "    \n",
    "    model.save('./model/word2vec.model')\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "### 搜索Word2vec模型，获取和说相关的词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Design Software\\Anaconda\\envs\\py36\\lib\\site-packages\\gensim\\utils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial\n",
      "  warnings.warn(\"detected Windows; aliasing chunkize to chunkize_serial\")\n"
     ]
    }
   ],
   "source": [
    "from gensim.models import word2vec\n",
    "from gensim.models import Word2Vec\n",
    "from gensim.models.word2vec import LineSentence\n",
    "from gensim.models import KeyedVectors\n",
    "from gensim.test.utils import datapath\n",
    "from collections import defaultdict\n",
    "import logging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "code_folding": [],
    "hidden": true
   },
   "outputs": [],
   "source": [
    "import time\n",
    "def get_related_words_im(initial_words, model):\n",
    "    \"\"\"\n",
    "    @initial_words are initial words we already know. is a list input\n",
    "    @model is the word2vec model\n",
    "    \"\"\"\n",
    "    unseen = initial_words\n",
    "    \n",
    "    seen = defaultdict(int)\n",
    "    \n",
    "    max_size = 500  # could be greater\n",
    "    \n",
    "    current_layer = 0\n",
    "    current_layer_length = len(unseen)\n",
    "    current_length = len(initial_words)  \n",
    "    \n",
    "    total_most_similar_find_time = 0\n",
    "    cache_dict = defaultdict(list)  #添加换乘，防止重复调用most_similar\n",
    "    while unseen and len(seen) < max_size:\n",
    "        if len(seen) % 50 == 0: \n",
    "            print('seen length : {}'.format(len(seen)))\n",
    "            \n",
    "        #print(unseen)\n",
    "            \n",
    "        node = unseen.pop(0)#类似广度搜索\n",
    "        \n",
    "        current_length -= 1 \n",
    "        \n",
    "        if node in cache_dict:\n",
    "            new_expanding = cache_dict[node]\n",
    "        else:\n",
    "            time_point = time.time()\n",
    "            new_expanding = [w for w, s in model.most_similar(node, topn=20)]\n",
    "            cache_dict[node] = new_expanding\n",
    "            total_most_similar_find_time += time.time()- time_point \n",
    "        \n",
    "        \n",
    "        unseen += new_expanding\n",
    "        \n",
    "        #当前层数遍历完，说明此时的unseen里保存的是下一层所有结点,更新层数和下一层结点个数\n",
    "        if current_length ==0: \n",
    "            current_layer += 1\n",
    "            current_layer_length = len(unseen)\n",
    "            current_length  = len(unseen)\n",
    "            \n",
    "        \n",
    "        #if seen['说']== 2:\n",
    "        #    break\n",
    "        \n",
    "        seen[node] +=  (1 - current_layer*0.1) * ((current_length/current_layer_length)*0.2 + 0.8)\n",
    "        \n",
    "        # optimal: 1. score function could be revised\n",
    "        # optimal: 2. using dymanic programming to reduce computing time\n",
    "    total_most_similar_find_time = int(total_most_similar_find_time)\n",
    "    print(current_layer)\n",
    "    print('total_most_similar_find_time:{}min {}s'.\\\n",
    "          format(total_most_similar_find_time//60 ,total_most_similar_find_time%60))\n",
    "    return seen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Design Software\\Anaconda\\envs\\py36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
      "  'See the migration notes for details: %s' % _MIGRATION_NOTES_URL\n"
     ]
    }
   ],
   "source": [
    "#logging.basicConfig(format=\"%(asctime)s:%(levelname)s:%(message)s\",level=logging.INFO)\n",
    "#from gensim.models import KeyedVectors\n",
    "fname = r\"E:/MYGIT/model/wiki_stopwords/wiki_word2vec.kv\"\n",
    "#model_wv.save(fname)\n",
    "model_wv = KeyedVectors.load(fname, mmap='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2019-08-14 11:39:52,375:INFO:loading Word2Vec object from E:/MYGIT/model/news/news_word2vec.model\n",
      "D:\\Design Software\\Anaconda\\envs\\py36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
      "  'See the migration notes for details: %s' % _MIGRATION_NOTES_URL\n",
      "2019-08-14 11:39:55,885:INFO:loading trainables recursively from E:/MYGIT/model/news/news_word2vec.model.trainables.* with mmap=None\n",
      "2019-08-14 11:39:55,885:INFO:loading syn1neg from E:/MYGIT/model/news/news_word2vec.model.trainables.syn1neg.npy with mmap=None\n",
      "2019-08-14 11:40:17,834:INFO:loading wv recursively from E:/MYGIT/model/news/news_word2vec.model.wv.* with mmap=None\n",
      "2019-08-14 11:40:17,834:INFO:loading vectors from E:/MYGIT/model/news/news_word2vec.model.wv.vectors.npy with mmap=None\n",
      "2019-08-14 11:41:36,006:INFO:setting ignored attribute vectors_norm to None\n",
      "2019-08-14 11:41:36,240:INFO:loading vocabulary recursively from E:/MYGIT/model/news/news_word2vec.model.vocabulary.* with mmap=None\n",
      "2019-08-14 11:41:36,255:INFO:setting ignored attribute cum_table to None\n",
      "2019-08-14 11:41:36,302:INFO:loaded E:/MYGIT/model/news/news_word2vec.model\n"
     ]
    }
   ],
   "source": [
    "#>>> from gensim.test.utils import get_tmpfile\n",
    "#>>> from gensim.models import KeyedVectors\n",
    "#>>>\n",
    "#>>> fname = get_tmpfile(\"vectors.kv\")\n",
    "#>>> word_vectors.save(fname)\n",
    "#>>> word_vectors = KeyedVectors.load(fname, mmap='r')\n",
    "logging.basicConfig(format=\"%(asctime)s:%(levelname)s:%(message)s\",level=logging.INFO)\n",
    "path = 'E:/MYGIT/model/news/news_word2vec.model'\n",
    "model = Word2Vec.load(path)\n",
    "model_wv = model.wv\n",
    "del model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "del model_wv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "222 ms ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit\n",
    "model_wv.most_similar('认为', topn=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "51"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "111%60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "seen length : 0\n",
      "seen length : 50\n",
      "seen length : 100\n",
      "seen length : 150\n",
      "seen length : 150\n",
      "seen length : 150\n",
      "seen length : 200\n",
      "seen length : 250\n",
      "seen length : 300\n",
      "seen length : 350\n",
      "seen length : 400\n",
      "seen length : 450\n",
      "3\n",
      "total_most_similar_find_time:1min40s\n",
      "Wall time: 1min 40s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "related_words  = get_related_words_im(['说', '表示'], model_wv)\n",
    "result_sorted = sorted(related_words.items(), key=lambda x: x[1], reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "seen length : 0\n",
      "seen length : 50\n",
      "seen length : 100\n",
      "seen length : 150\n",
      "seen length : 150\n",
      "seen length : 150\n",
      "seen length : 200\n",
      "seen length : 250\n",
      "seen length : 300\n",
      "seen length : 350\n",
      "seen length : 400\n",
      "seen length : 450\n",
      "3\n",
      "Wall time: 1min 40s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "related_words  = get_related_words_im(['说', '表示'], model_wv)\n",
    "result_sorted = sorted(related_words.items(), key=lambda x: x[1], reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "#result_sorted"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "result_sorted = sorted(related_words.items(), key=lambda x: x[1], reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "with open('similar_word_wk2', 'w',encoding='utf-8') as  f:\n",
    "    for line in result_sorted:\n",
    "        f.write(str(line)+'\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用NER&Denpendency Prasing对句子进行解析 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 句子依存关系解析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分析步骤：\n",
    "1. 把文章切断成句子\n",
    "2. 对条句子进行分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sqlalchemy import Column, String, create_engine\n",
    "from sqlalchemy.orm import sessionmaker\n",
    "from sqlalchemy.ext.declarative import declarative_base\n",
    "from sqlalchemy.sql import select"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "passward = '####'\n",
    "host = '####'\n",
    "user = 'root'\n",
    "post = '3306'\n",
    "database = 'stu_db'\n",
    "engine= create_engine(\"mysql+mysqlconnector://{}:{}@{}:{}/{}\".format(user,passward,host,post,database))\n",
    "connection = engine.connect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "id_list = connection.execute(\"select id from news_chinese\")\n",
    "id_list = id_list.fetchall()\n",
    "content_list = connection.execute(\"select content from news_chinese\")\n",
    "content_list = content_list.fetchall()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "code_folding": [
     15,
     27,
     40,
     56
    ]
   },
   "outputs": [],
   "source": [
    "from pyltp import Segmentor\n",
    "from pyltp import Postagger\n",
    "from pyltp import NamedEntityRecognizer\n",
    "from pyltp import SentenceSplitter\n",
    "from pyltp import Parser\n",
    "import os\n",
    "\n",
    "#分句\n",
    "def cut_sentence(string):\n",
    "    \"\"\"@string contain many sentence\"\"\"\n",
    "    from pyltp import SentenceSplitter\n",
    "    sents = SentenceSplitter.split(string)  # 分句\n",
    "    return list(sents)\n",
    "    \n",
    "#分词\n",
    "def cut_word(sentence):\n",
    "    \"\"\"@sentence is a string\"\"\"\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径，模型名称为`cws.model`\n",
    "\n",
    "    segmentor = Segmentor()  # 初始化实例\n",
    "    segmentor.load_with_lexicon(cws_model_path, '..\\ltp_data\\cut_external_dict\\cut_external_dict')  # 加载模型\n",
    "    words = segmentor.segment(sentence)  # 分词\n",
    "    segmentor.release()  # 释放模型\n",
    "    return list(words)\n",
    "\n",
    "#词信标注\n",
    "def pos_label(words):\n",
    "    \"\"\"@words is a list result of cut word\"\"\"\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径，模型名称为`pos.model`\n",
    "\n",
    "    postagger = Postagger() # 初始化实例\n",
    "    postagger.load_with_lexicon(pos_model_path, '../ltp_data/pos_external_dict/pos_external_dict')   # 加载模型\n",
    "\n",
    "    postags = postagger.postag(words)  # 词性标注\n",
    "    postagger.release()  # 释放模型\n",
    "    return list(postags)\n",
    "\n",
    "#命名实体识别\n",
    "def ner_label(words, postags):\n",
    "    \"\"\"@words is a list  result of cut word\n",
    "       @postags is a list result of Part-Of-Speech tagging\n",
    "    \"\"\"\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 命名实体识别模型路径，模型名称为`pos.model`\n",
    "\n",
    "    recognizer = NamedEntityRecognizer() # 初始化实例\n",
    "    recognizer.load(ner_model_path)  # 加载模型\n",
    "\n",
    "    netags = recognizer.recognize(words, postags)  # 命名实体识别\n",
    "    recognizer.release()  # 释放模型\n",
    "    \n",
    "    return list(netags)\n",
    "\n",
    "#依存句法分析\n",
    "def dependency_parsing(words, postags):\n",
    "    \"\"\"@words is a list  result of cut word\n",
    "       @postags is a list result of Part-Of-Speech tagging\n",
    "    \"\"\" \n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 依存句法分析模型路径，模型名称为`parser.model`\n",
    "    \n",
    "    parser = Parser() # 初始化实例\n",
    "    parser.load(par_model_path)  # 加载模型\n",
    "\n",
    "    arcs = parser.parse(words, postags)  # 句法分析\n",
    "\n",
    "    parser.release()  # 释放模型\n",
    "    return list(arcs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "code_folding": [
     0
    ]
   },
   "outputs": [],
   "source": [
    "def pretty_print(word_list, ner_list):   \n",
    "    import math\n",
    "    num = math.ceil(len(word_list)/14)\n",
    "    index = range(1, len(word_list)+1)\n",
    "    for line_num in range(num):\n",
    "        str1 = ''\n",
    "        str2 = ''\n",
    "        str3 = ''\n",
    "        if line_num == num -1:\n",
    "            word_temp = word_list[line_num*14:]\n",
    "            ner_temp = ner_list[line_num*14:]\n",
    "            index_temp = index[line_num*14:]\n",
    "        else:\n",
    "            word_temp = word_list[line_num*14:(line_num+1)*14]\n",
    "            ner_temp = ner_list[line_num*14:(line_num+1)*14]   \n",
    "            index_temp = index[line_num*14:(line_num+1)*14]\n",
    "        for i, j in zip(word_temp, ner_temp):\n",
    "            i_len = len(i)\n",
    "            j_len = len(j)\n",
    "            if i_len > 5:\n",
    "                str1 += '{}\\t|'\n",
    "                str2 += '{}\\t\\t|'\n",
    "                str3 += '{}\\t\\t|'\n",
    "            else:\n",
    "                str1 += '{}\\t|'\n",
    "                str2 += '{}\\t|'\n",
    "                str3 += '{}\\t|'\n",
    "        print(str3.format(*index_temp))\n",
    "        print(str1.format(*word_temp))\n",
    "        print(str2.format(*ner_temp),'\\n')\n",
    "        \n",
    "def table_print(word_list, ner_list):\n",
    "    import prettytable as pt\n",
    "    tb = pt.PrettyTable()\n",
    "    tb.add_column('1',word_list)\n",
    "    tb.add_column('2',ner_list)\n",
    "    print(tb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "命名实体识别标注集:\n",
    "- 标记 =\t含义\n",
    "- O =\t这个词不是NE\n",
    "- S =\t这个词单独构成一个NE\n",
    "- B =\t这个词为一个NE的开始\n",
    "- I =\t这个词为一个NE的中间\n",
    "- E =\t这个词位一个NE的结尾\n",
    "- Nh =\t人名\n",
    "- Ni =\t机构名\n",
    "- Ns =\t地名"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用依存句法分析找出观点的内容"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "code_folding": [
     0,
     4,
     9,
     22
    ]
   },
   "outputs": [],
   "source": [
    "def find_word_index(word,words):\n",
    "    for i in range(len(words)):\n",
    "        if words[i] == word:\n",
    "            return i\n",
    "def find_head(den_parsing_list):\n",
    "    for i in range(len(den_parsing_list)):\n",
    "        if den_parsing_list[i].head == 0:\n",
    "            return i\n",
    "\n",
    "def search_index(start, den_parsing_list,word_list):\n",
    "    tree_dict = {word_list[start]:{}}\n",
    "    j=0\n",
    "    for i,arc in enumerate(den_parsing_list):\n",
    "        if arc.head == start+1:\n",
    "            j +=1\n",
    "            tree_dict[word_list[start]][word_list[i]] = \\\n",
    "            search_index(i,den_parsing_list,word_list)\n",
    "    if j==0:return word_list[start]\n",
    "    return tree_dict  \n",
    "\n",
    "from collections import defaultdict\n",
    "#该函数找出树形结构关系，并返回关系，层数和最大宽度，方便图绘制\n",
    "def search_find_dict(start, den_parsing_list,word_list_orgin):\n",
    "    word_list = []\n",
    "    #对重复词进行重新编号，以区别\n",
    "    for i,word in enumerate(word_list_orgin):\n",
    "        if word in word_list:\n",
    "            word_list.append(word+'_'+str(i))\n",
    "        else:\n",
    "            word_list.append(word)\n",
    "            \n",
    "    tree_dict = defaultdict(list)\n",
    "    \n",
    "    current_layer = 0\n",
    "    length = len(start)\n",
    "    max_length = 0\n",
    "    while start!= []:\n",
    "        current_p = start.pop(0)\n",
    "        length -= 1 \n",
    "        for i,arc in enumerate(den_parsing_list):\n",
    "            if arc.head == current_p+1:\n",
    "                start.append(i)\n",
    "                tree_dict[word_list[current_p]] += [[word_list[i],arc.relation]]\n",
    "        #当遍历到下一层时\n",
    "        if length == 0:\n",
    "            current_layer +=1\n",
    "            length = len(start)\n",
    "            if max_length < length:\n",
    "                max_length = length\n",
    "    return tree_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif']= ['SimHei']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "自定义个绘制了依存句法关系的模块：\n",
    "\n",
    "模块在plottree.plottree 里的 createPlot方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "去掉标点，对比一下结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 获取依存关系某结点所有的子树构成的句子"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们在4.1中得到了句子的依存关系树,现要获取某个节点以下的所有词所构成的句子\n",
    "- 方法1：直接遍历pyltp的分析结果，找出所有该节点下的元素的索引值\n",
    "- 方法2：在自己构建的字典中找"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "code_folding": [
     0
    ]
   },
   "outputs": [],
   "source": [
    "def search_find_sentence(start, den_parsing_list, word_list):\n",
    "    if not isinstance(start, list):\n",
    "        start = [start]\n",
    "    \n",
    "    words_index = []\n",
    "    words_index.append(start[0])\n",
    "    while start != []:\n",
    "        cur = start.pop(0)\n",
    "        for i,arc in enumerate(den_parsing_list):\n",
    "            if arc.head == cur+1:\n",
    "                words_index.append(i)\n",
    "                start.append(i)\n",
    "                \n",
    "    words_index_sorted = sorted(words_index)\n",
    "    \n",
    "    return ''.join([word_list[i] for i in words_index_sorted])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 针对说等次词，找出其宾语即说的内容"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下列的**受访者**没有被识别为命名实体，可以通过词性标注外部词典来增加用户自定义命名实体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "code_folding": [
     0,
     31
    ]
   },
   "outputs": [],
   "source": [
    "def pretty_print(word_list, ner_list):   \n",
    "    import math\n",
    "    num = math.ceil(len(word_list)/14)\n",
    "    index = range(1, len(word_list)+1)\n",
    "    for line_num in range(num):\n",
    "        str1 = ''\n",
    "        str2 = ''\n",
    "        str3 = ''\n",
    "        if line_num == num -1:\n",
    "            word_temp = word_list[line_num*14:]\n",
    "            ner_temp = ner_list[line_num*14:]\n",
    "            index_temp = index[line_num*14:]\n",
    "        else:\n",
    "            word_temp = word_list[line_num*14:(line_num+1)*14]\n",
    "            ner_temp = ner_list[line_num*14:(line_num+1)*14]   \n",
    "            index_temp = index[line_num*14:(line_num+1)*14]\n",
    "        for i, j in zip(word_temp, ner_temp):\n",
    "            i_len = len(i)\n",
    "            j_len = len(j)\n",
    "            if i_len > 5:\n",
    "                str1 += '{}\\t|'\n",
    "                str2 += '{}\\t\\t|'\n",
    "                str3 += '{}\\t\\t|'\n",
    "            else:\n",
    "                str1 += '{}\\t|'\n",
    "                str2 += '{}\\t|'\n",
    "                str3 += '{}\\t|'\n",
    "        print(str3.format(*index_temp))\n",
    "        print(str1.format(*word_temp))\n",
    "        print(str2.format(*ner_temp),'\\n')\n",
    "        \n",
    "def table_print(word_list, ner_list):\n",
    "    import prettytable as pt\n",
    "    tb = pt.PrettyTable()\n",
    "    tb.add_column('1',word_list)\n",
    "    tb.add_column('2',ner_list)\n",
    "    print(tb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "code_folding": [
     9,
     13,
     18,
     34,
     55,
     75,
     87,
     93,
     120,
     141,
     154,
     167
    ]
   },
   "outputs": [],
   "source": [
    "from collections import defaultdict\n",
    "from pyltp import Segmentor\n",
    "from pyltp import Postagger\n",
    "from pyltp import NamedEntityRecognizer\n",
    "from pyltp import SentenceSplitter\n",
    "from pyltp import Parser\n",
    "import os\n",
    "import time\n",
    "\n",
    "def find_word_index(word,words):\n",
    "    for i in range(len(words)):\n",
    "        if words[i] == word:\n",
    "            return i\n",
    "def find_head(den_parsing_list):\n",
    "    for i in range(len(den_parsing_list)):\n",
    "        if den_parsing_list[i].head == 0:\n",
    "            return i\n",
    "        \n",
    "def search_find_sentence(start, den_parsing_list, word_list):\n",
    "    if not isinstance(start, list):\n",
    "        start = [start]\n",
    "    \n",
    "    words_index = []\n",
    "    words_index.append(start[0])\n",
    "    while start != []:\n",
    "        cur = start.pop(0)\n",
    "        for i,arc in enumerate(den_parsing_list):\n",
    "            if arc.head == cur+1:\n",
    "                words_index.append(i)\n",
    "                start.append(i)\n",
    "                \n",
    "    words_index_sorted = sorted(words_index)\n",
    "    \n",
    "    return ''.join([word_list[i] for i in words_index_sorted])\n",
    "def search_find_sentence_1(start, den_parsing_list, word_list):\n",
    "    #和之前的search_find_sentence比，该函数不会返回和start并列的的词语下的语句\n",
    "    start_point = start\n",
    "    if not isinstance(start, list):\n",
    "        start = [start]\n",
    "    \n",
    "    words_index = []\n",
    "    words_index.append(start[0])\n",
    "    while start != []:\n",
    "        cur = start.pop(0)\n",
    "        for i,arc in enumerate(den_parsing_list):\n",
    "            if arc.head == cur+1:\n",
    "                if arc.head == start_point+1 and arc.relation =='COO': continue\n",
    "                words_index.append(i)\n",
    "                start.append(i)\n",
    "                \n",
    "    words_index_sorted = sorted(words_index)\n",
    "    \n",
    "    return ''.join([word_list[i] for i in words_index_sorted])\n",
    "\n",
    "#找出输入所有节点中最小的索引和最大的索引，然后返回两者间的句子\n",
    "def find_sentence(parent_point, den_parsing_list, word_list):\n",
    "    #parent_point could be a list\n",
    "    assert  len(den_parsing_list) == len(word_list)\n",
    "        \n",
    "    words_index = []\n",
    "    #搜索子节点\n",
    "    for point in parent_point:\n",
    "        start = [point]\n",
    "        words_index.append(start[0])\n",
    "        while start!= []:\n",
    "            cur = start.pop(0)\n",
    "            for i, arc in enumerate(den_parsing_list):\n",
    "                if arc.head == cur + 1:\n",
    "                    words_index.append(i)\n",
    "                    start.append(i)\n",
    "    words_index = sorted(words_index)\n",
    "    #print(words_index, len(word_list))\n",
    "    return ''.join(word_list[words_index[0]:words_index[-1]+1])\n",
    "\n",
    "\n",
    "def search_index(start, den_parsing_list,word_list):\n",
    "    tree_dict = {word_list[start]:{}}\n",
    "    j=0\n",
    "    for i,arc in enumerate(den_parsing_list):\n",
    "        if arc.head == start+1:\n",
    "            j +=1\n",
    "            tree_dict[word_list[start]][word_list[i]] = \\\n",
    "            search_index(i,den_parsing_list,word_list)\n",
    "    if j==0:return word_list[start]\n",
    "    return tree_dict    \n",
    "\n",
    "#分句\n",
    "def cut_sentence(string):\n",
    "    \"\"\"@string contain many sentence\"\"\"\n",
    "    from pyltp import SentenceSplitter\n",
    "    sents = SentenceSplitter.split(string)  # 分句\n",
    "    return list(sents)\n",
    "\n",
    "def load_all_model():\n",
    "    \"\"\"返回分词，词性标注，命名实体识别，依存解析等实例对象\"\"\"\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径，模型名称为`cws.model`\n",
    "    segmentor = Segmentor()  # 初始化实例\n",
    "    segmentor.load_with_lexicon(cws_model_path, '../ltp_data/cut_external_dict/cut_external_dict')  # 加载模型\n",
    "    \n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径，模型名称为`pos.model`\n",
    "    postagger = Postagger() # 初始化实例\n",
    "    postagger.load_with_lexicon(pos_model_path, '../ltp_data/pos_external_dict/pos_external_dict')  # 加载模型\n",
    "\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 命名实体识别模型路径，模型名称为`pos.model`\n",
    "    recognizer = NamedEntityRecognizer() # 初始化实例\n",
    "    recognizer.load(ner_model_path)  # 加载模型\n",
    "\n",
    "    LTP_DATA_DIR = 'E:/MYGIT/Project/ltp_data'  # ltp模型目录的路径\n",
    "    par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 依存句法分析模型路径，模型名称为`parser.model`   \n",
    "    parser = Parser() # 初始化实例\n",
    "    parser.load(par_model_path)  # 加载模型\n",
    "    \n",
    "    return segmentor, postagger, recognizer, parser\n",
    "def release_all_model(model_list):\n",
    "    for each in model_list:\n",
    "        each.release()\n",
    "#获取人名或机构名\n",
    "def get_name(name_index, ner_list, word_list):\n",
    "    # 合并说话对象名字\n",
    "    if ner_list[name_index][0] == 'S':\n",
    "        name = word_list[name_index]\n",
    "    elif ner_list[name_index][0] == 'B':\n",
    "        if ner_list[name_index + 1][0] == 'I':\n",
    "            name = ''.join([word_list[name_index + i] for i in range(3)])\n",
    "        else:\n",
    "            name = ''.join([word_list[name_index + i] for i in range(2)])\n",
    "    elif ner_list[name_index][0] == 'E':\n",
    "        if ner_list[name_index - 1][0] == 'I':\n",
    "            name = ''.join([word_list[name_index - i] for i in [2, 1, 0]])\n",
    "        else:\n",
    "            name = ''.join([word_list[name_index - i] for i in [1, 0]])\n",
    "    elif ner_list[name_index][0] == 'I':\n",
    "        name = ''.join([word_list[name_index + i] for i in [-1, 0, 1]])\n",
    "\n",
    "    return name\n",
    "\n",
    "#找到离index最近的那个人名\n",
    "#找到离index最近的那个人名\n",
    "def find_replace_name(candidate, index, compared_word):\n",
    "    for i, name in enumerate(candidate):\n",
    "        if name[1] >= index:\n",
    "            flag = i-1\n",
    "            break\n",
    "    if  candidate[-1][1]< index:\n",
    "        flag = len(candidate) -1\n",
    "        \n",
    "    while flag> 0 and (candidate[flag][0] == compared_word or candidate[flag][0] in ['他', '她们', '她', '他们', '其']):\n",
    "        flag -= 1   \n",
    "    return candidate[flag]\n",
    "\n",
    "##如果规则提取不出，采用，。等标识提取句子\n",
    "def rule_1(candidate, word_list):\n",
    "    start_flag = True\n",
    "    for i in range(candidate[1], len(word_list)):\n",
    "        if start_flag and word_list[i] in [':', ',', '，', '：']:\n",
    "            start = i\n",
    "            start_flag = False\n",
    "        if word_list[i] in ['。', '！']:\n",
    "            end = i\n",
    "            break\n",
    "    say_text = ''.join(word_list[start + 1:end + 1])\n",
    "    return say_text\n",
    "\n",
    "\n",
    "def rule_2(name, name_list, _i, candidate, den_parsing_list, word_list):\n",
    "    while name in ['他', '她们', '她', '他们', '其']:\n",
    "        # 获取他等词语后面的第一个实体，把该实体排除在他的指代词外\n",
    "        after_name = [_name[0] for _name in name_list if _name[1] > _i * 1000 + candidate[0]]\n",
    "        if after_name != []:\n",
    "            compared_word = after_name[0]\n",
    "        else:\n",
    "            compared_word = 'test'\n",
    "        try:\n",
    "            name_and_index = find_replace_name(name_list, _i * 1000 + candidate[0], compared_word)\n",
    "            name = name_and_index[0]\n",
    "        except:\n",
    "            pass\n",
    "    if name in ['爷爷', '奶奶', '公司', '人士'] and name in word_list:\n",
    "        try:\n",
    "            index = name_and_index[1] % 1000\n",
    "        except NameError:\n",
    "            index = candidate[0]\n",
    "        name = find_sentence([index], den_parsing_list, word_list)\n",
    "    return   name\n",
    "\n",
    "\n",
    "def find_opinion_of_someone(input_news, say_related, model_list):\n",
    "    # 输入文本进行分句\n",
    "    time_point_0 = time.time()\n",
    "    segmentor = model_list[0]\n",
    "    postagger = model_list[1]\n",
    "    recognizer= model_list[2]\n",
    "    parser= model_list[3]\n",
    "    print(\"模型加载时间: {:4f}\".format(time.time() - time_point_0))\n",
    "\n",
    "    sentence_list = cut_sentence(input_news)\n",
    "    sentence_list = [sen for sen in sentence_list if len(sen) > 3]\n",
    "    Entity = ['S-Nh', 'S-Ni', 'B-Nh', 'B-Ni', 'I-Nh', 'I-Ni', 'E-Nh', 'E-Ni']  # 命名实体标记\n",
    "    news_list = []\n",
    "\n",
    "    name_list = [] #用于保存所有命令实体\n",
    "    for _i, sentence in enumerate(sentence_list):\n",
    "        print('\\n——————————句子:{} 处理过程——————————'.format(_i + 1))\n",
    "        time_point_1 = time.time()\n",
    "        word_list = list(segmentor.segment(sentence))  # 分词\n",
    "        pos_list = list(postagger.postag(word_list))  # 词性分析\n",
    "        ner_list = list(recognizer.recognize(word_list, pos_list))  # 命名实体提取\n",
    "        den_parsing_list = list(parser.parse(word_list, pos_list))  # 依存关系\n",
    "\n",
    "        time_point_2 = time.time()\n",
    "        print(\"pyltp模块处理时间: {:4f}\".format(time_point_2 - time_point_1))\n",
    "\n",
    "\n",
    "        # 获取命名实体和说相关词,同时获取索引值\n",
    "        pro_say_word = [(a, i) for i, a in enumerate(word_list) if a in say_related]\n",
    "        pro_name = [(a, i) for i, a in enumerate(ner_list) if a in Entity]\n",
    "        pro_say = [i[0] for i in pro_say_word]\n",
    "        \n",
    "        #把命名实体存入，并保持实体在整个输入文章的位置信息，用_i*100+ name[1]来表示\n",
    "        for name in pro_name:\n",
    "            name_list.append((word_list[name[1]],_i*1000+ name[1]))\n",
    "        # 以下三行用于调试\n",
    "        if pro_name == [] and pro_say_word == []:\n",
    "            print('没有:相应命名实体,没有:相应说类似操作')\n",
    "        elif pro_name == []:\n",
    "            print('没有:相应命名实体,有:相应说类似操作')\n",
    "        elif pro_say_word == []:\n",
    "            print('有:相应命名实体,没有:相应说类似操作')\n",
    "\n",
    "        # 如果没有命名实体和说相关词，跳过本句\n",
    "        if pro_name == [] or pro_say_word == []: continue\n",
    "\n",
    "        #获取可能存在的人和其对应的观点索引\n",
    "        candidates = []\n",
    "        for _a in pro_name:#增加了ATT\n",
    "            if den_parsing_list[_a[1]].relation in ['SBV','ATT'] and \\\n",
    "                word_list[den_parsing_list[_a[1]].head-1] in pro_say:\n",
    "                candidates.append((_a[1], den_parsing_list[_a[1]].head-1))         \n",
    "        if candidates ==[] :\n",
    "            #处理冒号特殊场景   \n",
    "            if '：' in pro_say:\n",
    "                try:\n",
    "                    name = find_replace_name(name_list, 1000*_i + pro_say_word[pro_say.index('：')][1], 'test')[0]\n",
    "                    say_text = rule_1((1 ,pro_say_word[pro_say.index('：')][1]), word_list)\n",
    "                    news_list.append(['第{}句:'.format(_i + 1), name, say_text])\n",
    "                except:\n",
    "                    pass\n",
    "        if candidates == []: continue\n",
    "        \n",
    "        #从候选集中获取观点\n",
    "        print(candidates)\n",
    "        for candidate in candidates:\n",
    "            say_word_under = []\n",
    "            assert ner_list[candidate[0]] in Entity\n",
    "            name = get_name(candidate[0], ner_list, word_list)\n",
    "\n",
    "            for i, arc in enumerate(den_parsing_list):\n",
    "                if candidate != candidates[-1]:##出现多个时候，并列的是属于后一个人说的话\n",
    "                    if arc.head - 1 == candidate[1] and arc.relation in ['VOB']:\n",
    "                        say_word_under.append(i)\n",
    "                else:\n",
    "                    if arc.head - 1 == candidate[1] and arc.relation in ['VOB','COO']:\n",
    "                        say_word_under.append(i)\n",
    "            \n",
    "            #else后是附加规则来提取\n",
    "            #如果规则提取不出，采用，。等标识提取句子\n",
    "            #规则1,提取句子规则：\n",
    "            if say_word_under != []:\n",
    "                say_text = find_sentence(say_word_under, den_parsing_list, word_list)\n",
    "            else:\n",
    "                try:\n",
    "                    say_text = rule_1(candidate, word_list)\n",
    "                except:\n",
    "                    continue\n",
    "\n",
    "            #规则2：他，她们等词替换, 找距离他之前最近的一个命名实体，更换指代规则\n",
    "            try:\n",
    "                name = rule_2(name, name_list, _i, candidate, den_parsing_list, word_list)\n",
    "            except:\n",
    "                pass\n",
    "\n",
    "            news_list.append(['第{}句:'.format(_i + 1), name, say_text])\n",
    "\n",
    "            time_point_3 = time.time()\n",
    "            print(\"人名句子提取处理时间: {:4f}\".format(time_point_3 - time_point_2))\n",
    "\n",
    "    #postagger.release()  # 释放模型\n",
    "    #recognizer.release()  # 释放模型\n",
    "    #parser.release()  # 释放模型\n",
    "    #segmentor.release()  # 释放模型\n",
    "    return news_list"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "### 测试提取效果，用以改进提取算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "import random\n",
    "import re\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "code_folding": [
     0
    ],
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 4 ms\n"
     ]
    }
   ],
   "source": [
    "def get_relatedwords():\n",
    "    path  = 'E:/MYGIT/Project/NLP-Project-1/related_words'\n",
    "    path_list = os.listdir(path)\n",
    "    relatedwords_list = []\n",
    "    for i in path_list:\n",
    "        with open(os.path.join(path,i), encoding='utf-8') as f:\n",
    "            line_str= f.readline()\n",
    "            while line_str  != '':\n",
    "                relatedwords_list.append(re.findall(\"'(.*?)'\",line_str)[0])\n",
    "                line_str = f.readline()\n",
    "    relatedwords_list = tuple(relatedwords_list)\n",
    "    return relatedwords_list\n",
    "relatedwords_list = get_relatedwords()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 4 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "relatedwords_list = get_relatedwords()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'询问' in relatedwords_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('告诉', '指出', '表示', '说', '认为', '透露', '介绍', '称', '解释', '坦言')"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "relatedwords_list[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "news_path = r'E:/MYGIT/DataSources/THUCNews/news_origin/社会新闻_all.txt'\n",
    "news_list = []\n",
    "with open(news_path, encoding='utf-8') as f:\n",
    "    for i in range(10000):\n",
    "        line_str = f.readline()\n",
    "        if line_str == '': break\n",
    "        if line_str.startswith('视频') or line_str.startswith('调查') or len(line_str)>1500: continue\n",
    "        news_list.append(line_str.strip('\\n'))\n",
    "#news_list[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "model_list = list(load_all_model())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "release_all_model(model_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "test = random.choice(news_list)\n",
    "test = test.replace('\\u3000','')\n",
    "test = test.replace('\\\\n','')\n",
    "sentence_list = cut_sentence(test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型加载时间: 0.000000\n",
      "\n",
      "——————————句子:1 处理过程——————————\n",
      "pyltp模块处理时间: 0.042002\n",
      "\n",
      "——————————句子:2 处理过程——————————\n",
      "pyltp模块处理时间: 0.006000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:3 处理过程——————————\n",
      "pyltp模块处理时间: 0.008001\n",
      "\n",
      "——————————句子:4 处理过程——————————\n",
      "pyltp模块处理时间: 0.006000\n",
      "\n",
      "——————————句子:5 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "[(0, 2)]\n",
      "人名句子提取处理时间: 0.001000\n",
      "\n",
      "——————————句子:6 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "[(0, 1)]\n",
      "人名句子提取处理时间: 0.001000\n",
      "\n",
      "——————————句子:7 处理过程——————————\n",
      "pyltp模块处理时间: 0.006001\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:8 处理过程——————————\n",
      "pyltp模块处理时间: 0.003000\n",
      "\n",
      "——————————句子:9 处理过程——————————\n",
      "pyltp模块处理时间: 0.007001\n",
      "\n",
      "——————————句子:10 处理过程——————————\n",
      "pyltp模块处理时间: 0.002000\n",
      "没有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:11 处理过程——————————\n",
      "pyltp模块处理时间: 0.005000\n",
      "没有:相应命名实体,有:相应说类似操作\n",
      "\n",
      "——————————句子:12 处理过程——————————\n",
      "pyltp模块处理时间: 0.007000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:13 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:14 处理过程——————————\n",
      "pyltp模块处理时间: 0.006000\n",
      "[(0, 1)]\n",
      "人名句子提取处理时间: 0.000000\n",
      "\n",
      "——————————句子:15 处理过程——————————\n",
      "pyltp模块处理时间: 0.002000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:16 处理过程——————————\n",
      "pyltp模块处理时间: 0.005000\n",
      "\n",
      "——————————句子:17 处理过程——————————\n",
      "pyltp模块处理时间: 0.003000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:18 处理过程——————————\n",
      "pyltp模块处理时间: 0.002000\n",
      "没有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:19 处理过程——————————\n",
      "pyltp模块处理时间: 0.006001\n",
      "[(0, 1)]\n",
      "人名句子提取处理时间: 0.000000\n",
      "\n",
      "——————————句子:20 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:21 处理过程——————————\n",
      "pyltp模块处理时间: 0.008001\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:22 处理过程——————————\n",
      "pyltp模块处理时间: 0.006000\n",
      "\n",
      "——————————句子:23 处理过程——————————\n",
      "pyltp模块处理时间: 0.002000\n",
      "[(6, 7)]\n",
      "人名句子提取处理时间: 0.000000\n",
      "\n",
      "——————————句子:24 处理过程——————————\n",
      "pyltp模块处理时间: 0.003000\n",
      "没有:相应命名实体,有:相应说类似操作\n",
      "\n",
      "——————————句子:25 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "\n",
      "——————————句子:26 处理过程——————————\n",
      "pyltp模块处理时间: 0.005000\n",
      "\n",
      "——————————句子:27 处理过程——————————\n",
      "pyltp模块处理时间: 0.002000\n",
      "有:相应命名实体,没有:相应说类似操作\n",
      "\n",
      "——————————句子:28 处理过程——————————\n",
      "pyltp模块处理时间: 0.003000\n",
      "\n",
      "——————————句子:29 处理过程——————————\n",
      "pyltp模块处理时间: 0.005000\n",
      "[(4, 7)]\n",
      "人名句子提取处理时间: 0.000000\n",
      "\n",
      "——————————句子:30 处理过程——————————\n",
      "pyltp模块处理时间: 0.004000\n",
      "\n",
      "——————————句子:31 处理过程——————————\n",
      "pyltp模块处理时间: 0.001000\n",
      "有:相应命名实体,没有:相应说类似操作\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[['第5句:', '家长', '学生们也明确向他们表示不愿意换班主任'],\n",
       " ['第6句:', '冯先生', '儿子在得知武老师要离开后，甚至还提出要转校'],\n",
       " ['第9句:', '武', '每到周五晚上，直到晚10点钟后，仍会给家长们一一打去电话，嘱咐他们在随后休息的两天里，注意督导孩子。'],\n",
       " ['第14句:', '常先生', '今年1月16日，40位家长都来到学校，向校方请求留下武老师'],\n",
       " ['第19句:', '常先生', '随后他们又两次去找北外附中的彭校长请愿，直至校长出差回京后答复将于昨天约见武老师'],\n",
       " ['第23句:', '家长', '严格管理学生。'],\n",
       " ['第29句:', '彭', '家长们对于武老师的挽留是有道理的，他本人也相信武老师能信守承诺，带好这个班级']]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "find_opinion_of_someone(test,relatedwords_list,model_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['老师因体罚学生遭辞退 家长请求校方将其留任本报讯（记者王琼）昨晚5时40分，20位学生家长冒雨将题有“好学校好老师桃李天下，听民意尊事实不负众望”的致谢匾送到了北京外国语大学附属中学（下称北外附中）办公室，以此感谢校方听从家长请愿，同意留下此前打算辞退的班主任武老师。',\n",
       " '“辞退令”引家长集体担忧武老师有着21年教龄，去年刚受聘到该校担任初一（1）班班主任。',\n",
       " '据家长常先生回忆，学校放寒假的第二天，他主动给武老师打电话，询问假期如何督导儿子，却意外得知她被学校辞退了。',\n",
       " '消息很快在家长中不胫而走，由此引发了家长们的集体担忧：“这么好的班主任，怎么能被学校辞退呢？”',\n",
       " '家长们称，学生们也明确向他们表示不愿意换班主任。',\n",
       " '冯先生称，儿子在得知武老师要离开后，甚至还提出要转校。',\n",
       " '家长赞其为“放心班主任”“我孩子上大学了，已经没有负担了，我会全身心地投入到这个班级。”',\n",
       " '武老师在家长会上曾这样承诺，这话让家长赵先生至今难忘。',\n",
       " '在他眼中，武老师认真负责：每到周五晚上，直到晚10点钟后，仍会给家长们一一打去电话，嘱咐他们在随后休息的两天里，注意督导孩子。',\n",
       " '“把孩子交给这样的老师，我们放心!',\n",
       " '”家长常先生强调自己的儿子是个“调皮大王”，偏偏服从武老师的管教。',\n",
       " '更为关键的是，武老师教的这个学期，整个班级学生的学习成绩跃居年级第二，仅次于尖子生集中的“实验班”。',\n",
       " '家长5次到学校请愿武老师教的班级共有42名学生。',\n",
       " '常先生称，今年1月16日，40位家长都来到学校，向校方请求留下武老师。',\n",
       " '“她体罚学生！”',\n",
       " '常先生从该校一位领导处得知，校方开办公会议后，以体罚学生为由决定辞退武老师。',\n",
       " '5天后，家长们再次来到学校请愿，但两次请愿均无进展。',\n",
       " '“2月1日和10日，我们又去找校长。”',\n",
       " '常先生说，随后他们又两次去找北外附中的彭校长请愿，直至校长出差回京后答复将于昨天约见武老师。',\n",
       " '昨天下午1时，20位家长代表冒雨赶到了北外附中，第5次向学校请愿。',\n",
       " '留住武老师家长欢呼昨晚5时许，家长们苦等4个小时后，终于盼到了想要的结果——武老师留下了，这让家长们情不自禁地鼓起掌来欢呼。',\n",
       " '武老师也解释了所谓的“体罚事件”，班中有个学生传了一个纸条，内容不堪入目，气得她忍不住拍了这个学生的后背。',\n",
       " '当时觉得此举是应学生家长要求，严格管理学生。',\n",
       " '根本就没有想到事隔半个学期后，竟会因为此事被辞退。',\n",
       " '校方请武老师提供书面说明昨晚5时40分，家长们将一块特地赶制出来的致谢匾送到了该校办公室。',\n",
       " '彭校长解释称，个别学生不服从管教，直接影响到整个班级，班主任武老师在管理时，也应该注重方式方法。',\n",
       " '尽管她当时打这个学生完全是出于好意。',\n",
       " '学校还是按照校规要求她做出了书面说明，并保证以后绝不会再打学生。',\n",
       " '彭校长表示，他能充分理解到家长们对于武老师的挽留是有道理的，他本人也相信武老师能信守承诺，带好这个班级。',\n",
       " '学校开了4次办公会议，听取老教师和家长们的意见后，最终作出了留任决定。',\n",
       " 'J010']"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentence_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第1句: 老师因体罚学生遭辞退 家长请求校方将其留任本报讯（记者王琼）昨晚5时40分，20位学生家长冒雨将题有“好学校好老师桃李天下，听民意尊事实不负众望”的致谢匾送到了北京外国语大学附属中学（下称北外附中）办公室，以此感谢校方听从家长请愿，同意留下此前打算辞退的班主任武老师。\n",
      "第2句: “辞退令”引家长集体担忧武老师有着21年教龄，去年刚受聘到该校担任初一（1）班班主任。\n",
      "第3句: 据家长常先生回忆，学校放寒假的第二天，他主动给武老师打电话，询问假期如何督导儿子，却意外得知她被学校辞退了。\n",
      "第4句: 消息很快在家长中不胫而走，由此引发了家长们的集体担忧：“这么好的班主任，怎么能被学校辞退呢？”\n",
      "第5句: 家长们称，学生们也明确向他们表示不愿意换班主任。\n",
      "第6句: 冯先生称，儿子在得知武老师要离开后，甚至还提出要转校。\n",
      "第7句: 家长赞其为“放心班主任”“我孩子上大学了，已经没有负担了，我会全身心地投入到这个班级。”\n",
      "第8句: 武老师在家长会上曾这样承诺，这话让家长赵先生至今难忘。\n",
      "第9句: 在他眼中，武老师认真负责：每到周五晚上，直到晚10点钟后，仍会给家长们一一打去电话，嘱咐他们在随后休息的两天里，注意督导孩子。\n",
      "第10句: “把孩子交给这样的老师，我们放心!\n",
      "第11句: ”家长常先生强调自己的儿子是个“调皮大王”，偏偏服从武老师的管教。\n",
      "第12句: 更为关键的是，武老师教的这个学期，整个班级学生的学习成绩跃居年级第二，仅次于尖子生集中的“实验班”。\n",
      "第13句: 家长5次到学校请愿武老师教的班级共有42名学生。\n",
      "第14句: 常先生称，今年1月16日，40位家长都来到学校，向校方请求留下武老师。\n",
      "第15句: “她体罚学生！”\n",
      "第16句: 常先生从该校一位领导处得知，校方开办公会议后，以体罚学生为由决定辞退武老师。\n",
      "第17句: 5天后，家长们再次来到学校请愿，但两次请愿均无进展。\n",
      "第18句: “2月1日和10日，我们又去找校长。”\n",
      "第19句: 常先生说，随后他们又两次去找北外附中的彭校长请愿，直至校长出差回京后答复将于昨天约见武老师。\n",
      "第20句: 昨天下午1时，20位家长代表冒雨赶到了北外附中，第5次向学校请愿。\n",
      "第21句: 留住武老师家长欢呼昨晚5时许，家长们苦等4个小时后，终于盼到了想要的结果——武老师留下了，这让家长们情不自禁地鼓起掌来欢呼。\n",
      "第22句: 武老师也解释了所谓的“体罚事件”，班中有个学生传了一个纸条，内容不堪入目，气得她忍不住拍了这个学生的后背。\n",
      "第23句: 当时觉得此举是应学生家长要求，严格管理学生。\n",
      "第24句: 根本就没有想到事隔半个学期后，竟会因为此事被辞退。\n",
      "第25句: 校方请武老师提供书面说明昨晚5时40分，家长们将一块特地赶制出来的致谢匾送到了该校办公室。\n",
      "第26句: 彭校长解释称，个别学生不服从管教，直接影响到整个班级，班主任武老师在管理时，也应该注重方式方法。\n",
      "第27句: 尽管她当时打这个学生完全是出于好意。\n",
      "第28句: 学校还是按照校规要求她做出了书面说明，并保证以后绝不会再打学生。\n",
      "第29句: 彭校长表示，他能充分理解到家长们对于武老师的挽留是有道理的，他本人也相信武老师能信守承诺，带好这个班级。\n",
      "第30句: 学校开了4次办公会议，听取老教师和家长们的意见后，最终作出了留任决定。\n",
      "第31句: J010\n"
     ]
    }
   ],
   "source": [
    "for _a, i in enumerate(sentence_list):\n",
    "    print('第{}句: {}'.format(_a+1, i))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "sentence = '我送她一粟花'\n",
    "word_list = cut_word(sentence)\n",
    "pos_list = pos_label(word_list)\n",
    "ner_list = ner_label(word_list,pos_list)\n",
    "den_parsing_list = dependency_parsing(word_list,pos_list)\n",
    "dp_list = [str(arc.head) + ':'+ arc.relation for arc in den_parsing_list]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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ejTs7OxyOSnR+0tOTsbx48fRrl07mJqa4vTp0+jevTsGDhyIhw8fAgBiY2PRuXNnjBo1Sj/f6tdff4Wvry+mTp0KjUYDSZKwdOlSdO7cGYsXL4ZOp0P9+vVRunRpHDx4UOQQCzSFlFuHQUiI7OxsHDp0CDt37sSJEydw7do1pKamwt7eHra2tm98jVarxd27d5GWlobKlSujRo0a6NixIzp27JhjcjCRobhx4wYCAgKwa9cu3Lt3D/b29qhQoQLKly//1ve5RqNBYmIi7t69i9u3b+snxPv5+ennchEZArVajR49eqBnz57Yvn07tm/fjlOnTmH58uVo3749AgMDERYWhnXr1mHv3r0AXl1lGB4ejkmTJuHRo0coVaoU7t+/j+3bt6Nv374oUaIEEhMTUbduXaxbt04/J5fyFktWPpSamoqrV6/i2bNnb1xvZmaGypUro2zZsvyHR0YnNTUV165dw9WrV3HlypV/fZ9XqVIF1apVQ/Xq1VG2bFkWKzJYarUa48ePx6pVq/T3xfrll1+wZs0abNmyBdWrV4ckSejbty+ioqJw/vx5lC5dGllZWRg5ciQSExOxefNmFCpUCC9fvkT//v1RokQJLF++nD/nBWLJIiIiMhIhISEICAhASEiI6Cj0DlhviYiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIiIZMCSRURERCQDliwiIiIiGbBkEREREcmAJYuIiIhIBixZRERERDJgySIiIiKSAUsWERERkQxYsoiIiIhkwJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIiIZMCSRURERCQDliwiIiIiGbBkEREREcmAJYuIiIhIBixZRERERDJgySIiIiKSAUsWERERkQxYsoiIiIhkwJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIiIZMCSRURERCQDliwiIiIiGbBkEREREcmAJYuIiIhIBixZRERERDJgySIiIiKSAUsWERERkQxYsoiIiIhkwJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVERGQgNBoNChcujDlz5uiXubi4QKFQQKFQoEOHDggNDYVCoUB8fDzi4+P16/75n4uLi7hBkB5LFhERkYFISEjAixcvEBYWpl8WGhqK5ORkrFixAoUKFULbtm2RnJyMli1bomXLlkhOTkZycjIqVqyI+fPnIzk5GaGhoQJHQX8zEx2AiIiIXgkLC4OHhwdiYmLw+PFjlCxZEoUKFQIAWFtbQ6FQwNzcHHZ2dvrX/P3/JiYmsLKyyrGOxOKRLCIiIgMRFhaGvn37olKlSoiMjBQdhz4SSxYREZEBuHz5Mq5evYrWrVujdevWOU4ZknFiySIiIjIAYWFhqFixIipVqoRWrVph3759yM7OFh2LPgLnZBERERmAsLAw3L9/H3Z2dsjKykJaWhoOHz6MVq1aiY5GH4hHsoiIiARLTU3FgQMHsHjxYpw+fRrnzp1DjRo1eMrQyLFkERERCfb3qcGePXvCwcEBDg4O8PT0ZMkycixZREREgoWFhaFx48YoUaKEfpmXlxfOnTuH27dvC0xGH0MhSZIkOgQRERH9t5CQEAQEBCAkJER0FHoHPJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIiIZMCSRURERCQDliwiIiIiGbBkEREREcmAJYuIiIhIBixZRERERDJgySIiIiKSAUsWERERkQxYsoiIiIhkwJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIiIZMCSRURERCQDliwiIiIiGbBkEREREcmAJYuIiIhIBixZRERERDJgySIiIiKSAUsWERERkQxYsoiIiIhkwJJFREREJAOWLCIiIiIZsGQRERERyYAli4iIiEgGLFlEREREMmDJIiIiIpIBSxYRERGRDFiyiIiIiGTAkkVEREQkA5YsIiIiIhmwZBERERHJgCWLiIiISAYsWUREREQyYMkiIiIikgFLFhEREZEMWLKIiIgMWFZWFh4//n/t3X2sl3X9x/HXEY4BHoyh5EruRCfeAG7OFJscb1LUMlagSevGLLWbpaxspVY7zJibN2k6QYc20WIubzLl0BhY8wA5ZyM1AWUcRBSV4iiChzhybr6/P1rn10klrPPhe5iPx8bGru91ffa+xh8897mu8z2b33G8s7Mzf/vb36owEbtLZAFAH7Z69eqceOKJ6ejo6HH82muvzdVXX12lqdgd/as9AADw3iZMmJCRI0dm/vz5GTp0aJJk27Ztuemmm7Js2bIqT8eu2MkCgD6uoaEhP/3p0S2LHQAAEL9JREFUT9PZ2ZkkufXWWzN58uQcccQRVZ6MXampVCqVag8BAOzaaaedlgkTJuT555/PihUrsmzZMpHVx4ksANgLNDU1Zfr06dl///1z3HHHZf78+dUeif9AZAHAXmLChAlZuXJlVq9ebRdrL+CdLADYS/zkJz/JWWedJbD2EnayAAAKsJMFAFCAyAKAKmtvb8+SJUvS1dXVfWzbtm1pamrqcd6mTZvy5JNP9ji2fv36rFy5ssex1atXZ/369eUGZreILACoovb29px//vmZOnVqvvzlL6e9vT2bN2/OySefnClTpuSHP/xhKpVKmpubM3HixJx55pmZPXt2kuTJJ5/MCSeckPr6+vz2t79NkjQ2Nuakk07KxIkT8+yzz1bz1j7wfOM7AFTJPwPr9ddfz4IFC9LQ0JBzzjknL7zwQk455ZTccMMN+e53v5sXX3wxTU1N+frXv57jjz8+l112WVasWJFHHnkkP/rRjzJs2LBccskl+d3vfpeHHnooN910U1599dWcfvrpefTRRzN+/Phq3+oHkhffAaBKNm7cmDFjxmT27Nk59thj09HRkdmzZ+djH/tYzjvvvCTJ9u3bc/PNN+f444/P6aefniRpaWnJzTffnM997nM59thjkyQvvvhi5s6dm4suuihjxoxJW1tbLr744px//vlpaGio2j1+kIksAKiixsbGXHDBBbn66qszceLE7uNtbW3p379/+vf/zw+dOjo60tHRkQEDBiRJ3nrrrXzve9/LkUcemXnz5qW2trbY/Lw3jwsBoIrOOeecTJ8+PXfddVePyLr44ovz3HPPpV+/fknS/VL8Pvvs0+PvSdLZ2Znhw4d3v5e1fPnybNy4MX/4wx8EVhXZyQKAKqlUKpk5c2buvvvu3HLLLTn44IO7P9u5c2e6urq6g+rOO+9MZ2dnvvGNb+Suu+5Ka2trLr300iRJTU1N+vXrl3333TfJP4LsZz/7WZ577rksXrw4Bx100J6/OUQWAFTLhg0bMnr06MybNy/jxo17x+ezZs3q3p3alaOOOir33HNPj2OdnZ35yle+kqlTp+aaa67ptZnZff1mzpw5s9pDAMAH0ZAhQ3LggQemoaEhxx9/fIYOHdrj8yeeeCKTJk3K7bffno6OjkyYMCG/+MUvUqlUMnbs2MybNy9HHnlkVq1alSlTpnRf197enpkzZ6a2tjZz5szpfleLPctOFgBU2WWXXZZly5blzjvv7HF81qxZeeSRR1JTU/Oe72RVKpUcccQRPXayGhsbM3v27Kxbty6DBw/eczdCDyILAKronnvuyeWXX54bbrjhXR8Z/qtKpZIdO3Zk4MCBqampec/z2tractVVV2XQoEF58MEHM2jQoN4em93gG98BoEpeeumlfPWrX8211177noH1yiuv5Nvf/nba2try+uuvp76+Plu3bk2SNDQ0ZPHixe+4ZsCAAbnuuuvy4osveh+rikQWAFTJ8OHDc+mll+baa6/N5s2be3z25ptvZvv27amrq0v//v3z8ssvp6OjI8k/vhdr5cqVaWpqytixY9Pa2po33nij+9pKpZK5c+ems7Mzl1xyyR69J/6fx4UAUEWVSiXf/OY38/TTT2fOnDndxz/1qU9l27Zt3Y8Fu7q68vbbb3d/PnDgwB5rdHV15fHHH0+SLF68ODfeeGNWr16dYcOG7aE74d+JLACoosceeyznnnturrjiipx66qnvek5zc3MaGhoybty4PPjgg/nWt76VP//5z5kxY0YOP/zwd5z/xhtvZMaMGamvr8/s2bO7v9CUPUtkAUCVvPbaaxkzZkyuv/76nHjiiT0+6+joyIoVK/Lwww/n5ZdfzpVXXpmXXnopP/7xj7N06dKsW7cut912W1pbW3Pcccdl7NixOfPMM7uvb21tzcUXX5yvfe1rueKKK/b0rRG/VgcAqmbo0KGZPHly7r333hxzzDE9fgrw9ttvz5o1a3Luueemvr4+NTU1eeGFF5Ikb7/9dsaPH585c+Zk06ZN+eMf//iOtX//+99n69atmTx58h67H3qykwUAVdTR0ZEvfvGLaWlpyXXXXbfLc5cuXZqHHnooN9100y7PW758eWbNmpXly5dn7NixvTku74OfLgSAKmpubs7jjz+eY489ttfWHDVqVPbdd980Njb22pq8fyILAKpk8+bNmTRpUi666KJMnz49SbJo0aI89dRT3ed0dXXlgQceyNq1a7uP7dy5M7/61a+yadOm7mOtra25++67s23btowYMSJz587Nrbfemttuu23P3RA9eCcLAKpk4MCB+ehHP5oNGzakUqlkzpw5aWpqytatW/ODH/wgJ598cmbNmpX169fnzjvvzPTp09PZ2ZnLL788bW1t+fWvf51bbrkl+++/f2bMmJH99tsvixYtyi233JItW7aktbU1o0ePrvZtfmB5JwsAqqilpSWnnXZa2tvbM2jQoCxatCgbN27M2WefnQMOOCAjRozIb37zmyxfvjzTpk1LpVLJ5z//+cydOzfz58/P97///QwaNCgXXnhhGhoacs011+T2229PW1tb7rjjjnz2s5+t9i1+YIksAKiylpaW3HHHHfnOd77T/Qud165dm4cffjgzZsxIbW1tkuTGG2/MvHnz8swzz3R/SemSJUvS0tKSL3zhC93r3XfffRk6dGhOP/30PX8zdBNZALCXWLBgQebOnZsFCxZUexR2gxffAQAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAKEFkA0Efs3LkzgwcPzqxZs7qPnXLKKampqUlNTU2mTJmSxsbG1NTU5LHHHstjjz3W/dm//jnllFOqdxN0E1kA0Ec0NTWltbU1Cxcu7D7W2NiYLVu2ZPbs2Rk8eHDOPPPMbNmyJSeddFJOOumkbNmyJVu2bMmIESNy3XXXZcuWLWlsbKziXfBP/as9AADwDwsXLszkyZPz6KOPZvPmzRk2bFjq6uqSJIMGDUqS1NbWZsiQId3X/PPv++yzTwYOHNjjM6rLThYA9BELFy7Ml770pYwaNSqLFi2q9jj8j0QWAPQBa9asSXNzc+rr61NfX9/jkSF7J5EFAH3AwoULM2LEiIwaNSqTJk3K4sWL09nZWe2x+B94JwsA+oCFCxfm1VdfzZAhQ9LR0ZHt27fn8ccfz6RJk6o9Gv8lO1kAUGVvvfVWli1blp///Od5+umns3Llyhx++OEeGe7lRBYAVNk/Hw1Onz49o0ePzujRo3PWWWeJrL2cyAKAKlu4cGE+/vGP58ADD+w+dvbZZ2flypV56aWXqjgZ/4uaSqVSqfYQAMB/tmDBgsydOzcLFiyo9ijsBjtZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZAAAFiCwAgAJEFgBAASILAKAAkQUAUIDIAgAoQGQBABQgsgAAChBZANCHdXV1Zdu2be84XqlUsnXr1ipMxO4SWQDQhz377LM54YQT0tnZ2eP4jTfemCuvvLJKU7E7+ld7AADgvU2YMCEHHHBA7rvvvtTV1SVJtm/fnuuvvz5Lliyp8nTsip0sAOjDampqMnPmzFx99dXdu1m33XZbJk2alPHjx1d5OnalplKpVKo9BADw3iqVSiZNmpSJEydm1apVeeqpp7JkyRKR1ceJLADYCzz66KO58MILU1dXl3HjxuX++++v9kj8ByILAPYClUolRx99dJ5//vk888wzdrH2At7JAoC9QE1NTa666qrU19cLrL2EnSwAgALsZAEAFOB7sgCgD6lUKmlpacnatWvT3NyctWvX5s0333zXc/v3759DDz00hx12WA477LCMGjUqtbW1e3hi3ovHhQDQB6xZsyZz5szJAw88kL///e8ZOXJkhg8fnoMPPjj777//u16zc+fObNq0Ka+88kpefvnltLS05NRTT80FF1yQ8847LzU1NXv4LvhXIgsAquzpp5/OJz/5yUydOjWTJ0/OmDFj/qt1Wltbs3Tp0syfPz+f+cxncv311/fypLwfIgsAqmzatGkZM2ZMpk+f3ivrvfnmm5k6dWrWrl2bj3zkI72yJu+fF98BoIq2bt2aJUuW5NOf/nSvrTlkyJCcfPLJuffee3ttTd4/kQUAVfTss8/mkEMOyeDBg3t13WOOOSZ/+tOfenVN3h+RBQBVtGrVqv/6HaxdOfTQQ7Nq1apeX5fdJ7IAoIr+8pe/ZPTo0b2+7iGHHJI1a9akq6ur19dm94gsAKii1157LQcddFCvr1tXV5fa2tps3bq119dm9/gyUgCosnf7PqsNGzZk4MCBGThwYPr16/ee13Z1dWXHjh3ZsWNHRo4cWXJM3ieRBQB90LRp0973NU888UT69/dfe1/hXwIA+qBf/vKX+dCHPpQBAwbscierUqlkx44daWtrE1h9jH8NAOiDjjzyyGqPwP/Ii+8AUEW1tbXZuXNnr69bqVSyc+dOvzC6ikQWAFTR2LFjs2HDhl5f969//Ws+/OEPp66urtfXZveILACoonHjxmX9+vW9vu66dety1FFH9fq67D6RBQBVdPTRR6e5ubnX1123bl3Gjx/f6+uy+0QWAFTREUcckfb29l4Praamppxxxhm9uibvj8gCgCrq169fLrrootxxxx3p6OjolTWXL1+ezZs356yzzuqV9fjv1FQqlUq1hwCAD7IdO3Zk2rRpeeqpp3LqqafmmGOOyYgRIzJ8+PDst99+u7y2o6MjmzZtysaNG9Pc3JylS5dm48aNeeihh/KJT3xiD90B70ZkAUAf8dxzz+X+++/PihUrsnbt2qxfvz51dXUZMmTIu57f3t6eTZs2ZdiwYTn00EMzduzYTJkyJWeccUb23XffPTw9/05kAUAf1dXVlVdfffU9f8lzbW1tRo4cmQEDBuzhydgdIgsAoAAvvgMAFCCyAAAKEFkAAAWILACAAkQWAEABIgsAoACRBQBQgMgCAChAZAEAFCCyAAAK+D8yf4UV1jURtgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "relation_dict = search_find_dict([find_head(den_parsing_list)],den_parsing_list, word_list)\n",
    "start = word_list[find_head(den_parsing_list)]\n",
    "plottree.createPlot(start, relation_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "sentence_list = cut_sentence(test)\n",
    "sentence = sentence_list[28]\n",
    "word_list = cut_word(sentence)\n",
    "pos_list = pos_label(word_list)\n",
    "ner_list = ner_label(word_list,pos_list)\n",
    "den_parsing_list = dependency_parsing(word_list,pos_list)\n",
    "dp_list = [str(arc.head) + ':'+ arc.relation for arc in den_parsing_list]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'彭校长'"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_name('校长',word_list,[i.relation for i in den_parsing_list], ner_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'他能充分理解到家长们对于武老师的挽留是有道理的，他本人也相信武老师能信守承诺，带好这个班级。'"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_saying(word_list,[i.relation for i in den_parsing_list],[i.head for i in den_parsing_list],3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "from plottree import plottree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "彭校长表示，他能充分理解到家长们对于武老师的挽留是有道理的，他本人也相信武老师能信守承诺，带好这个班级。\n"
     ]
    }
   ],
   "source": [
    "print(sentence)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\t|2\t|3\t|4\t|5\t|6\t|7\t|8\t|9\t|10\t|11\t|12\t|13\t|14\t|\n",
      "彭\t|校长\t|表示\t|，\t|他\t|能\t|充分\t|理解\t|到\t|家长\t|们\t|对于\t|武\t|老师\t|\n",
      "2:ATT\t|3:SBV\t|0:HED\t|3:WP\t|8:SBV\t|8:ADV\t|8:ADV\t|3:VOB\t|8:CMP\t|17:SBV\t|10:RAD\t|17:ADV\t|14:ATT\t|12:POB\t| \n",
      "\n",
      "15\t|16\t|17\t|18\t|19\t|20\t|21\t|22\t|23\t|24\t|25\t|26\t|27\t|28\t|\n",
      "的\t|挽留\t|是\t|有\t|道理\t|的\t|，\t|他\t|本人\t|也\t|相信\t|武\t|老师\t|能\t|\n",
      "14:RAD\t|12:POB\t|8:VOB\t|17:VOB\t|18:VOB\t|18:RAD\t|17:WP\t|23:ATT\t|25:SBV\t|25:ADV\t|17:COO\t|27:ATT\t|29:SBV\t|29:ADV\t| \n",
      "\n",
      "29\t|30\t|31\t|32\t|33\t|34\t|35\t|36\t|\n",
      "信守\t|承诺\t|，\t|带\t|好\t|这个\t|班级\t|。\t|\n",
      "25:VOB\t|29:VOB\t|29:WP\t|29:COO\t|32:CMP\t|35:ATT\t|32:VOB\t|3:WP\t| \n",
      "\n",
      "1\t|2\t|3\t|4\t|5\t|6\t|7\t|8\t|9\t|10\t|11\t|12\t|13\t|14\t|\n",
      "彭\t|校长\t|表示\t|，\t|他\t|能\t|充分\t|理解\t|到\t|家长\t|们\t|对于\t|武\t|老师\t|\n",
      "nh\t|n\t|v\t|wp\t|nh\t|v\t|a\t|v\t|v\t|nh\t|k\t|p\t|nh\t|n\t| \n",
      "\n",
      "15\t|16\t|17\t|18\t|19\t|20\t|21\t|22\t|23\t|24\t|25\t|26\t|27\t|28\t|\n",
      "的\t|挽留\t|是\t|有\t|道理\t|的\t|，\t|他\t|本人\t|也\t|相信\t|武\t|老师\t|能\t|\n",
      "u\t|v\t|v\t|v\t|n\t|u\t|wp\t|nh\t|r\t|d\t|v\t|nh\t|n\t|v\t| \n",
      "\n",
      "29\t|30\t|31\t|32\t|33\t|34\t|35\t|36\t|\n",
      "信守\t|承诺\t|，\t|带\t|好\t|这个\t|班级\t|。\t|\n",
      "v\t|v\t|wp\t|v\t|a\t|r\t|n\t|wp\t| \n",
      "\n",
      "1\t|2\t|3\t|4\t|5\t|6\t|7\t|8\t|9\t|10\t|11\t|12\t|13\t|14\t|\n",
      "彭\t|校长\t|表示\t|，\t|他\t|能\t|充分\t|理解\t|到\t|家长\t|们\t|对于\t|武\t|老师\t|\n",
      "S-Nh\t|O\t|O\t|O\t|S-Nh\t|O\t|O\t|O\t|O\t|S-Nh\t|O\t|O\t|S-Nh\t|O\t| \n",
      "\n",
      "15\t|16\t|17\t|18\t|19\t|20\t|21\t|22\t|23\t|24\t|25\t|26\t|27\t|28\t|\n",
      "的\t|挽留\t|是\t|有\t|道理\t|的\t|，\t|他\t|本人\t|也\t|相信\t|武\t|老师\t|能\t|\n",
      "O\t|O\t|O\t|O\t|O\t|O\t|O\t|S-Nh\t|O\t|O\t|O\t|S-Nh\t|O\t|O\t| \n",
      "\n",
      "29\t|30\t|31\t|32\t|33\t|34\t|35\t|36\t|\n",
      "信守\t|承诺\t|，\t|带\t|好\t|这个\t|班级\t|。\t|\n",
      "O\t|O\t|O\t|O\t|O\t|O\t|O\t|O\t| \n",
      "\n"
     ]
    }
   ],
   "source": [
    "pretty_print(word_list,dp_list)\n",
    "pretty_print(word_list,pos_list)  \n",
    "pretty_print(word_list,ner_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "hidden": true,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAJDCAYAAAA4tQG6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeViN+f/H8ecp2besYyecUqGSVLLvJLtBmDHWsWSN7Exm0GInYxcGY8++y5pIiFSyjL1BCWk/5/eHS7/pO2bGUt0t78d1zXWN+9zL6+50zv3uc3/uz0el1Wq1CCGEEEKINKWjdAAhhPg3ERERTJs2jaioqJRlN2/exNXVlbi4uJRlZ8+eZf78+Wg0mpRlPj4+rF69OtX+vL292bt3b/oHF0LkeCppyRJCZFYRERE0atSIfPnykZSUxJEjR3jw4AHt27enfPnyFClSBB8fH06dOkW/fv345ptvqFmzJt7e3qxevZoZM2ZQoEABOnfuzNy5c5kyZQqbN28mJiaGRYsW0aNHD6VPUQiRjeVSOoAQQnzM69evadSoEY0bN2bAgAGsWbMGa2trYmJimDp1KjY2Nri5uVGnTh2ioqLw9PSkWrVqTJo0CTMzM16/fs3y5cspVKgQo0eP5sCBA6hUKlauXMnLly8ZMWIE+fLlo0OHDkqfqhAim5IiSwiRKcXHxxMZGUmVKlVQqVT0798fAwMDSpYsiampKQAuLi7s378fU1NTKleuDICbmxu7d++mUaNGlCxZEoClS5fi4+ODvb09BQsWRKvVUqhQIZ49e6bU6QkhcgC5XSiEyLSuXbtGixYtcHZ2pmnTpmmyz6ioKIYOHcq3336Lq6trmuxTCCE+Rjq+CyEyrdq1azNgwAC2bNnyr+slJyen/P/mzZu5c+fOP6577tw54uLicHFxSbOcQgjxMVJkCSEyrVWrVrFu3TqmTZuWavm7d+8ICwtj7969TJkyhTZt2vD8+XPevn3L/PnzCQsL+8d9tm3bFjMzM+zt7Xn37l16n4IQIgeT24VCiEzp/v37VKtWjY0bN1K9evVUr/Xq1YvY2FgiIyNp0aIFDRo0wMLCgqCgICZNmsSePXvQ09NLWV+lUpEvX76UfycnJzNkyBDatGnDzz//nGHnJITIWaTjuxAiU6pQoQJdu3Zl8eLFuLu7kydPnpTXvL29yZUrF3369KF169ZYWloC4O/vT1xcHPb29inrJiQkUKtWLVauXJmy7NChQzx9+pS+fftm3AkJIXIcuV0ohMiUdHV12bhxI2XKlPlba1OuXH//+zApKYlDhw7h6enJmTNnUv6rWrUqrVq1SlnP39+fpUuXcuLECQwNDdP9PIQQOZe0ZAkhMq13797x8OFDjIyMUpbdunWLH374gdy5cxMXF8eoUaPQaDR07NiRPHnyYGtry6+//kpsbCw9evTg9u3b2NjYpGxfuHBhkpOTefLkCTVq1FDitIQQOYT0yRJCZErv3r2jWbNmlC9fngkTJqBSqQDQaDQkJyezbNkyNmzYgKenJ2q1Gj09PaKjo6latSrLly8nJiaGsWPH8uLFC0qUKJFq31euXMHFxYVdu3bRsGFDJU5PCJEDyO1CIUSm9OrVK4KCgmjevHlKgQWgo6ODnp4eZ8+eJX/+/Jw7d44TJ05QokQJXr9+zZMnT3j79i3w/hZibGzs3/ZtZGTEN998g5+fX4adjxAi55EiSwiRKZUtW5Y9e/YwefJkrl69muq1y5cvo6urS5EiRdi7dy8LFiwgIiKCwYMHs3fvXnbt2kVAQADr169n1KhRJCUlpWwbGxvLmDFjsLKyYty4cRl9WkKIHESKLCFEptWsWTOGDRvGwoULUy339PQkOjqaiIgISpQogYuLC9euXUNPTw8rKyu6deuGVqtl8+bNvHz5ku3bt6dse/jwYSIiIvj111/R0ZGvQCFE+pFvGCFEpnXgwAGWLVuW0uJ0584devfuTXh4OHFxcejr6zNlyhS6dOnC9u3bMTU15dq1a+TLlw9LS0vWrFlDuXLlmDdvHrt37yY5OZk2bdpQsWJF+vbtm6qFSwgh0poUWUKITOnx48d06dKFuXPnUqpUKWbNmsXgwYPJly8fhQoVws3NjVKlSqGrq8vp06cJCwvD3t6ea9eupeyjYsWKrF69murVq7N9+3Z69+7NlStXmDt3LsHBwcydO1fBMxRCZHcyhIMQIlMqXrw4lpaWzJkzh4iICJo1a0aZMmXInz8/O3bsQF9fP2XOQnNzc9zc3ChfvjweHh4kJiamjIGVN29eNm3ahFar5dSpU7i7u5M/f36ePn1Ks2bNlDxFIUQ2J0WWECLTSUxMZM2aNdy+fRutVku1atU4deoU33//Pb169Up52vDNmzfExcVRqFAhrKysAIiLi+PevXsMGTIk1T5VKhVNmjRBX1+fkSNHkidPHpYtW0bZsmWpWLFihp+jECL7k9uFQohMQ6vVsmvXLkxNTdm1axe///47efLkITQ0lEWLFuHo6JhqOIe9e/diZ2eXah9NmjRh8ODBmJqafvQYGo2GfPnysXfvXipXroy5uTkTJkzg1atX6XpuQoicR4osIUSmcP78eezs7JgxYwaLFy9mzpw5tGvXjoSEBPbs2UONGjVISEj4W2f1+Ph4NBpNyr/Nzc0JDAzkf8dZjouLA8DCwoJx48bRqVMnunXrRlBQEJGRkajVahYsWEB8fHz6n6wQIkeQIksIoaiwsDC6du1Kjx49GDRoEAEBAYSHh9OyZUtiY2Px8PCgaNGi3L17l06dOjF06FDevHkDvB+5vXXr1kycOJGEhATgfTG1d+9ePD09U4qvzZs306BBAzZs2ABA48aNKVu2LNu2baNs2bKsXLmSkydPcvz4cWrUqMGWLVtSFW5CCPElZFodIYQi/vzzT3766Se2bt3KuHHjcHJyIjY2lgEDBvDHH3+wZcsWAgICcHJyYtiwYSxZsgQPDw8CAgI4cuQIPXr0YMmSJXh7e7N69WqePHmCnZ0d3t7evHnzBlNTU0qWLEmZMmXw9fVl/fr1/PDDD1hbW/P48WP09PTYtWsXefLkSZXr1KlTODs7o1KpcHNzo3Hjxsr8gIQQWZ9WCCEyUExMjHbWrFna4sWLa0eOHKl9/vy5VqvVak+fPq2tWLGidvTo0dq4uLiU9Tdv3qwtVaqUdt++fVqtVqvVaDTamTNnasuVK6e9ePGiVqvVapOSkrQDBw7UGhoaam/fvq1t2rSpdseOHdr27dtrraystBEREVqtVqt9/vy51sbGRuvg4JDqGP8rOTlZu3nzZm2VKlW09vb22hs3bqTXj0MIkY1JS5YQIkMkJyezbt06pk+fTv369fnll1+oWrUqycnJ/Pzzz3h5ebF69Wratm371ceaOnUqGo2Gn3/++av2Ex8fz7Jly5g9ezYdOnRg5syZlC1b9qvzCSFyBumTJYRIV1qtlgMHDlC7dm3Wr1/Pjh072Lp1K1WrVuXRo0c0a9aMU6dOERAQkCYFFkD9+vU5f/78V+8nT548jB49mtDQUIoVK0bNmjWZNm1aSp8wIYT4N1JkCSHSzeXLl2nWrBljx47ll19+wdfXl3r16gHg4+ODpaUlLVu25OjRo2naQmRtbc3ly5dJTExMk/3p6+szd+5crly5wv3791Gr1Xh5eaXZ/oUQ2ZMUWUKINHfv3j169eqFg4MDPXr0ICgoCAcHB1QqFXFxcTg5OeHk5MTOnTuZNGkSurq6aXr8okWLUrly5VRT7KSFSpUq4e3tzYEDB9i5c2fKeF7S60II8TFSZAkh0kxkZCRjx47F0tISIyMjwsLCGDRoELlyvZ9cIjQ0FBsbG548eUJgYCC2trbplsXW1jZNbhl+jLm5OUePHmXx4sXMmDGDBg0acOHChXQ5lhAi65IiSwjx1eLi4vDw8MDQ0JB3795x8+ZNpk2bRsGCBYH3/bLWrVuHnZ0dP/74I9u2bUNfXz9dM9na2nLu3Ll0PUbLli25cuUKAwcO5Ntvv6Vr167cvn07XY8phMg6pMgSQnwxjUbDxo0bMTIy4uzZs5w5cwYvLy+++eablHVev35N79698fDw4OTJkwwaNCjV1DjpJa06v/8XXV1dvvvuO0JDQ7G0tMTGxobhw4fz559/pvuxhRCZmxRZQogvcvz4cSwtLVmyZAkbNmxg9+7dGBkZpVrn0qVLWFhYUKhQIfz9/f9xPsH0ULVqVeLj43nw4EGGHC9fvny4uLgQEhJCrly5MDY25ueff+bdu3cZcnwhROYjRZYQ4rNcv36dNm3aMHjwYCZOnMiFCxdo0KBBqnU0Gg0eHh60a9eOuXPnsnz5cvLnz5+hOVUqVYa1Zv1ViRIlWLBgARcvXuT69euo1WrWrFlDcnJyhuYQQihPiiwhxCd59OgR/fr1o0WLFrRt25bg4GC6dev2t1t/ERERtG3bll27dnHp0iW6dOmiUOL07fz+X6pWrcrWrVvZsWMH69atw8zMjAMHDsiTiELkIFJkCSH+VXR0NJMmTaJ27dqUKVOGsLAwRowYQe7cuf+27tGjR7GwsMDS0hJfX18qVaqkQOL/lxGd3/9LvXr18PX15eeff2bs2LE0b96cgIAARTMJITKGFFlCiI9KSEhg8eLFqNVqnj17xrVr1/jll18oUqTI39ZNTEzExcWFfv36sWHDBmbNmpUybIOS6tSpQ0hICG/fvlU0h0qlwsHBgaCgIL799lvat2+Po6Mj9+/fVzSXECJ9SZElhEhFq9Wybds2jI2NOXDgAEePHmXNmjWUL1/+o+vfu3ePBg0aEBQURGBgIE2bNs3gxP8sb9681K5dG39/f6WjAJArVy4GDRpEWFgYarWaOnXqMG7cOCIjI5WOJoRIB1JkCSFSnD17FhsbG2bPns3y5cs5ePAgtWrV+sf1t27dSr169ejRowf79u2jZMmSGZj20yjR+f2/FCxYkOnTp3Pz5k3evn2LoaEhHh4exMXFKR1NCJGGpMgSQhASEkLHjh1xdHRk+PDhXL58mebNm//j+jExMQwYMICpU6dy6NAhRo0alSFjX30JJTu//5dvvvmG5cuXc/r0ac6ePYuRkRGbNm1Co9EoHU0IkQakyBIiB3v27Bk//vgjDRo0wM7OjtDQUHr37o2Ozj9/NVy/fh1LS0sSEhIICAjAwsIiAxN/PltbWy5cuJCpC5caNWqwe/duvL29WbRoEXXr1uXEiRNKxxJCfCUpsoTIgd6+fcvMmTMxMTEhf/78hISEMG7cOPLmzfuP22i1WpYuXUqzZs2YNGkS3t7eFCpUKANTf5nSpUtTvHhxbt26pXSU/9SwYUP8/PxwcXFh0KBBtG3blqCgIKVjCSG+kBRZQuQgSUlJrFixArVaTVhYGJcvX8bT05PixYv/63aRkZF07tyZNWvWcP78efr06ZNBidNGZr5l+L9UKhXdunUjODiYNm3a0Lx5c/r378/jx4+VjiaE+ExSZAmRA2i1Wvbu3UutWrXYvHkzPj4+bNq0iSpVqvzntmfOnMHc3BwDAwPOnz9P9erVMyBx2soM42V9rty5czNixAjCwsIoXbo0tWrVYvLkyURHRysdTQjxiaTIEiKb8/f3p3HjxkycOBEPDw9OnDiBpaXlf26XnJzMTz/9RPfu3fHy8sLT05M8efJkQOK0lxmfMPxURYoU4ZdffuHatWs8efIEtVrN4sWLSUhIUDqaEOI/qLQyx4MQ2dKdO3eYNGkSZ8+e5aeffuK777775AFCHz16RO/evdHV1WXDhg2ULVs2ndOmr+TkZIoXL05YWBilSpVSOs5XuX79OhMmTCA8PJzZs2fTpUuXTPtkpxA5nbRkCZHNvHjxglGjRlGvXj1q1qxJWFgY/fv3/+QCy8fHB0tLS1q2bMmRI0eyfIEFoKuri7W1NRcuXFA6ylerVasWBw8exMvLi59//hlbW1vOnj2rdCwhxEdIkSVENhEbG8ucOXMwMjIiKSmJ4OBgpkyZQoECBT5p+7i4OJycnHBycmLnzp1MmjQJXV3ddE6dcbJS5/dP8WEOxGHDhuHo6EinTp0IDQ1VOpYQ4i+kyBIii0tOTmb9+vUYGhpy6dIlzp8/z5IlSz7rtlhoaCjW1tY8ffqUq1evYmtrm46JlZEVO7//Fx0dHXr37k1oaCi2trbY2dkxdOhQIiIilI4mhECKLCGytCNHjlCnTh1WrFjBli1b2LFjB2q1+pO312q1rF27NuXi/Pvvv1O0aNF0TKycevXqERgYSHx8vNJR0lzevHlxdnYmJCSEfPnyYWJiwk8//URMTIzS0YTI0aTIEiILunr1Ki1btmT48OFMnz6ds2fPfnbr0+vXr3F0dMTT05NTp04xaNCgbN2BulChQqjVaq5cuaJ0lHRTvHhxPD09uXTpEiEhIajValauXElSUpLS0YTIkaTIEiILefDgAX379qV169Z07NiRmzdv0qlTp88uji5duoS5uTlFihTh0qVLmJiYpFPizCUrD+XwOapUqcJvv/3Gnj17+O2336hVqxZ79+5FHiYXImNJkSVEFvDq1SsmTJiAubk5lSpVIiwsjKFDh6Knp/dZ+9FoNLi7u2Nvb4+bmxteXl7ky5cvnVJnPtmt8/t/sbS05MSJE7i7u+Pi4kKTJk24dOmS0rGEyDGkyBIiE4uPj2fBggWo1WoiIyMJCgrC1dWVwoULf/a+IiIiaNu2Lbt378bf358uXbqkQ+LM7UPn95zUoqNSqWjXrh3Xrl2jT58+dOzYkR49enD37l2lowmR7UmRJUQmpNFo2LJlCzVq1ODYsWOcOHGClStXfvGYVUePHsXc3Jy6devi6+tLpUqV0jhx1lCpUiV0dXW5d++e0lEyXK5cuejfvz9hYWGYmppiZWXF6NGjefnypdLRhMi2pMgSIpPx9fXF2toaDw8PVq9ezb59+zA1Nf2ifSUmJjJhwgT69evHpk2bcHV1/eRBSbMjlUqVLYdy+BwFChRgypQpBAcHk5iYiJGREXPnziU2NlbpaEJkO1JkCZFJ3Lx5k/bt2/P9998zevRo/P39adKkyRfv7+7du9jZ2XHz5k0CAwO/al/ZSU7p/P5fSpUqxZIlSzh37hz+/v4YGhri7e2NRqNROpoQ2YYUWUIo7MmTJwwcOJAmTZrQtGlTQkJC6NmzJzo6X/7x3LJlC9bW1vTq1Yu9e/dSsmTJNEycteW0zu//Ra1Ws2PHDrZs2cLy5cuxsLDg6NGjSscSIluQCaKFUMibN29wd3dn6dKl9O/fn4kTJ6Kvr/9V+4yJicHJyYkzZ86wZcsWLCws0iht9pGQkECxYsV4/PgxRYoUUTpOpqLVatm1axcuLi5UqVIFNzc3ateurXQsIbIsackSIoMlJibi5eWFWq3m/v37XLlyBTc3t68usK5fv46lpSVJSUkEBARIgfUPcufOTZ06dbh48aLSUTIdlUpF586duXnzJg4ODrRq1YrvvvuOhw8fKh1NiCxJiiwhMsiHVgJTU1N27NjBgQMH8Pb2/uon/bRaLUuXLqVZs2ZMnjyZ9evXU6hQoTRKnT3l9M7v/0VPT49hw4YRFhZGxYoVMTMzw8XFhVevXikdTYgsRYosITLAhQsXaNCgAdOnT2fRokUpQyp8rcjISDp16sTatWs5f/48vXv3ToO02Z90fv80hQsXxtXVlevXr/PixQsMDQ1ZuHAhCQkJSkcTIkuQIkuIdHT79m26du1K9+7dGTBgAIGBgbRq1SpN5gg8c+YMZmZmVK1alfPnz1O9evU0SJwzWFtbc/HiRZKTk5WOkiWUK1eOVatWcfz4cY4ePUqNGjXYunVrjhrUVYgvIUWWEOngzz//ZPjw4djY2GBpaUlYWBjff/89urq6X73v5ORkZs6cSffu3Vm+fDmenp7kzp07DVLnHCVKlKBs2bIEBQUpHSVLMTU1Zd++faxatQp3d3fq1avH6dOnlY4lRKYlRZYQaejdu3f8/PPPGBsbo6ury61bt3BxcUmz+QEfPXpE06ZNOXPmDFeuXKFt27Zpst+cSG4ZfrkmTZrg7+/P6NGj+e6773BwcCA4OFjpWEJkOlJkCZEGkpOTWbNmDWq1mmvXruHn58fChQvTdHwqHx8f6tSpQ+vWrTl8+DBlypRJs33nRNL5/evo6OjQs2dPQkJCaNy4MY0bN2bQoEE8ffpU6WhCZBpSZAnxFbRaLQcOHMDMzIy1a9eyY8cOfv/9d6pVq5Zmx4iLi2PEiBGMHDmS3bt3M3HixDS57ZjTSUtW2siTJw9jxowhNDSUokWLYmpqyvTp03nz5o3S0YRQnBRZQnyhgIAAmjdvzpgxY5g1axanT5+mXr16aXqMkJAQrK2tiYiIIDAwEBsbmzTdf06mVqt5/fo1T548UTpKtqCvr4+bmxtXrlzh7t27qNVqli9fTmJiotLRhFCMFFlCfKb79+/j6OiIvb093bt358aNG3To0CFNnhj8QKvVsnbtWho0aMCwYcPYunUrRYsWTbP9i/e3u2xsbKQ1K41VqlSJDRs2sH//frZv307NmjXZvXu3PIkociQpsoT4RJGRkYwbN446depQvXp1bt++zeDBg8mVK1eaHic6OhpHR0fmzZuHr68vAwcOTNMCTvw/uWWYfj7MgbhgwQKmTZtGw4YN8fPzUzqWEBlKiiwh/kNcXBweHh4YGhry9u1bbty4wYwZMyhYsGCaH8vf3x8LCwuKFCmCv78/xsbGaX4M8f9ksuj0pVKpaN26NYGBgfTv359u3brRrVs3bt++rXQ0ITKEFFlC/AONRsOmTZswMjLizJkznD59muXLl6fLU30ajQY3Nzfat2+Pm5sbXl5eaTbsg/hndevWJSgoiNjYWKWjZGu6urp8//33hIaGYmFhgY2NDU5OTjx//lzpaEKkKymyhPiIEydOULduXRYtWoS3tzd79uyhRo0a6XKsiIgI2rRpg4+PD/7+/nTp0iVdjiP+Ln/+/JiYmHD58mWlo+QI+fPnZ+LEidy6dQuVSkWNGjX45ZdfePfundLRhEgXUmQJ8RdBQUG0bduWgQMHMmHCBPz8/GjYsGG6He/IkSOYm5tjZWXFqVOnvnqyaPH5ZLysjFeyZEkWLlyIn58fV69exdDQkLVr18o0RyLbkSJLCN6PpP7DDz/QvHlzWrduza1bt+jevXu6dThPSEhgwoQJ9O/fn02bNuHq6prmHejFp5HO78qpVq0av//+O9u2bWPNmjWYm5tz6NAheRJRZBtSZIkcLTo6msmTJ1O7dm1Kly5NaGgoTk5O6ToX4N27d2nQoAHBwcEEBgbSpEmTdDuW+G8fOr/LhV051tbWnD59GldXV0aNGkWLFi24cuWK0rGE+GpSZIks68GDBzg4OFC4cGEMDAxYuHAhAI0bN0alUqFSqShQoAD169dP+cLu1KkT7dq1IyEhgcWLF6NWqzl37hyvXr1i/Pjxnz0WlZmZGe7u7sTFxaGjo8OyZct4+fIlKpWK9u3bp+TImzcvFhYWTJo0CWtra3r16oWPjw8lSpRI85+LSO3De/5Xv//+O7ly5SIqKopdu3bx6tUr8ubNS4sWLbh37x4Ap06dSnn/dHR0KF++PBMnTkSj0ShxGtmeSqWiQ4cO3Lhxg27dumFvb0+fPn0wNjb+rM/YkSNHlD4VIVJIkSWyrC5dulC6dGlu3bqFp6cn48aN4/jx4wAMHz6cqKgo7ty5g4WFBQ4ODiQnJ9OuXTtOnDiBiYkJ+/fv58iRIxgZGWFra4u+vv5nZ6hSpQqPHz8mPDwcrVbL7du3efToEfD+ouHg4EBUVBTXr18nV65czJkzh9WrVzNy5EgZ+yqD2Nvbc/r06VQjj584cQIbGxtOnjzJmDFjqFu3LjNnzkRHRwcHB4dUhdSjR4+IjIxMuaW1YsUKJU4jx8iVKxeDBw8mNDSUqlWrEh4ezpYtWwgICPjXz1h4eDg9e/akQ4cOKYWyEEqTIktkSVFRUVy+fJmBAwdSrlw5OnXqxI8//sjdu3eB9/OpFS1alG+++YYhQ4bw+PFjduzYwfLly4mLi2PYsGEcOnSI2rVrc/z48b+1dHyqD0VWWFgYenp6KReAwoULU6xYMfT09Pjjjz/o0KEDxsbGVK5cmcePH6flj0L8h7Zt2xITE4O/v3/Ksg/v+YoVK+jWrRuOjo6Eh4ezdOlSbty4kWrdIkWKULRoUWxsbGjYsCEXLlxQ4jRynEKFCjFjxgz69etHVFQUbdu2RVdXl9DQ0L99xooWLUr58uVxdnambNmyHD58WOn4QgBSZIksqkiRIpQpU4Y5c+bw4sULABYtWsTAgQNTrafRaFiyZAm5c+dm3LhxjBw5EnNzc6Kjo4H3txzDw8O/qsh69OgRt2/fplWrVoSFhfHo0SOqVKkCwJ07d2jevDlTpkxh3bp15MmTR+Zyy2BlypTB3NycY8eOAanf86tXr2Jubp7S+b1atWoULFiQa9eu/W0/9+/f59y5c5iZmWX0KeRopqamlC5dmgEDBlCiRAmOHj3Kzp07Uz5j/yt37tzyGROZhhRZIkvS0dHBx8eHmzdvUqFCBQYPHszDhw9TXl+yZAmFCxdGT0+P5cuX88MPPxAWFkafPn2wt7dPua14/PhxKlSoQM2aNb8ox4eWqdu3b9OmTRsePnzI/fv3KVeuHCdOnOD+/ftcuHCBnj17sn37du7cuSMd3RXQrl27j77nL1++RF9fn5o1a/Lw4UMiIyMpWrQoL1++TNm2fPnyFC1alCpVqmBlZYWTk5NSp5EjffiMRUdHM23aNHR0dDhw4AB//PEHz549S1lPo9HIZ0xkOlJkiSzL0tKSW7du8dtvv3Hx4kXMzMy4cuUKycnJmJqaoqurS8+ePfn22285cOAAb968Ad5fcP38/IiJieH48eO0bdv2izNUqVKFp0+fEhISgomJCeXKlWP//v2cPn2awoULExMTg6WlJXnz5mXIkCH8+uuvmJqaptWPQHyif3rPVSoVWq2WXLlyYWVlxYULF9BoNKn6y50/f56AgAC2bdvGhQsX8PT0VOo0cqT//YxVqFCBatWqpYxvtnPnTgoXLiyfMZEpycA8Ikt6+fIljx49onbt2nTq1Al7e3tat26No6MjdzBxxnwAACAASURBVO/excDAgICAAAwMDNBoNBQpUoTNmzfj5OSElZUV+vr6nD59mpMnT7J8+fIvzlGlShWSkpI4d+4cBgYGqFQqgoKCGDx4MHFxcVSsWJFly5aRN29evvnmmzT8CYjP8U/veYkSJYiKigL+f7ys6OhoihcvnrJtxYoVKViwIFWrVuXevXvMnj2b8ePHK3IeOdFfP2NqtRq1Ws3BgwdZuHAhxYoVIyAggD///BN7e3vc3d0pV66c0pGFSCEtWSJLOn36NPXq1SM5ORmtVsuhQ4e4ceMGjx49wsTEhHbt2mFgYAD8f2vFh34aKpWKNm3asHDhQl6+fEmzZs2+OEeBAgUoWbIkBQsWxNHRkfj4eICUPl758+encuXKUmAp7J/ecwsLCwICAoD342UdO3aMmJgYzM3NP7qfv/4eiYzx4TNWqFAhypQpg1qtBt4XX7q6uhgbGxMeHk6lSpWoVasWU6ZM4fXr1wqnFuI9KbJElmRnZ0e+fPlwdHTE1taWkSNHoqOjw6hRoyhcuDDx8fG8evWKu3fvMnr0aN69e0fTpk1Ttm/Xrh2HDx+mSZMm5M+f/6uyFC1alLi4ONq0acOECRMA/rFTrlDOx97zwYMHs3PnTry9vSlVqhQBAQGYmZlhaWmZsl10dDQvXrzg+PHjLF68+KuKcvFlqlSpklJc/bXI+qBo0aLMnj2bq1ev8ujRI9RqNUuWLJGCWChOiiyRJb1+/Zo6deqwa9curly5QkJCAn369GHq1KnA+47vHzo0nzt3jm3btqVqnWjZsiV6enpf1R8rLi6O4cOH8/jxY5o0acLEiRMxMjIC3nfWFZnLx97z9u3bs3DhQiZPnoytrS158+blp59+StUnq3z58pQqVYq+ffvSunVrVq5cqUT8HO2vRZahoSHw8c9YhQoVWLduHYcPH2bfvn2YmJiwY8cOGc1fKEalld8+kYW8fPkSV1dXNmzYwKhRoxgzZgwFChTI8By3bt2iR48eGBoasmLFis8eKV5kToMHD8bY2JiRI0cqHUWkgaNHj+Ls7Ez+/Plxd3enfv36SkcSOYy0ZIksITY2lrlz52JoaEhiYiLBwcFMnTo1wwssrVbL6tWradiwIcOHD2fr1q1SYGUjMll09vJhDsQff/yRXr160blzZ0JDQ5WOJXIQKbJEppacnIy3tzeGhob4+/tz7tw5li5dSunSpTM8S3R0ND179mTBggX4+voycOBAmRonm/kwLIA08GcfOjo69OnTh5CQEKytrbGzs2PYsGFEREQoHU3kAFJkiUzryJEj1KlTh+XLl7N582Z27NiR0h8jo128eBFzc3OKFSuGv78/xsbGiuQQ6atq1aokJiamGthWZA/58uVj/PjxhISEkCdPHkxMTHB1dSUmJkbpaCIbkyJLZDrXrl2jVatWDB8+nGnTpnHu3DnF+lJoNBrmzp2Lg4MDHh4eLFu2jHz58imSRaQ/lUqFra2t3DLMxooXL868efPw9/cnODgYtVrNqlWrSEpKUjqayIakyBKZxoMHD/juu+9o1aoVDg4O3Lx5k86dOyt2S+7Zs2e0bt2avXv3cunSJTp37qxIDpGxPtwyFNmbgYEBmzdvZvfu3WzcuJHatWuzb98+uVUs0pQUWUJxr169YsKECZibm1OhQgXCwsIYNmwYenp6imU6fPgwFhYWWFtbc+rUKSpWrKhYFpGxpPN7zlK3bl1OnjzJ3LlzGT9+PE2bNuXy5ctKxxLZhBRZQjHx8fEsWLAAtVrNy5cvuX79OrNmzaJw4cKKZUpISGD8+PEMGDCA3377jZ9++olcuWT2qZzEwsKCkJAQ3r59q3QUkUFUKhX29vZcv36dXr160aFDB3r27Mm9e/eUjiayOCmyRIbTarVs3boVY2Njjh49yvHjx1m1apXic47duXMHOzs7bt26RWBgII0bN1Y0j1BG3rx5MTMzw9/fX+koIoPlypWLgQMHEhYWhrGxMXXr1mXMmDG8fPlS6Wgii5IiS2QoX19f6tWrh5ubGytXrmT//v3UrFlT6Vhs3rwZa2trevfujY+PDyVKlFA6klCQdH7P2QoUKMDUqVO5efMm8fHxGBkZ4e7uTlxcnNLRRBYjRZbIEMHBwTg4OPD9998zatQoLl26lGouQaXExMTwww8/MGPGDI4cOYKTk5OMfSWk87sAoHTp0ixdupSzZ89y4cIFDA0N2bBhAxqNRuloIouQIkukq6dPnzJo0CAaN25M48aNCQkJoVevXujoKP+rd/XqVerUqYNWqyUgICDV3IYiZ7O1tcXPz08upgJ4P1/izp07+e233/Dy8qJOnTocPXpU6VgiC1D+SieypTdv3jB9+nRMTU0pUqQIoaGhjBkzhjx58igdDa1Wy+LFi2nRogVTp05l7dq1FCxYUOlYIhMpXbo0xYsX59atW0pHEZlI/fr1OXfuHFOmTGHo0KG0bt2aa9euKR1LZGJSZIk0lZiYiJeXF2q1mjt37hAQEIC7uzv6+vpKRwPeTzDdsWNHvL298fPzw9HRUelIIpOSW4biY1QqFV26dCE4OBh7e3tatWrF999/L7MEiI+SIkukCa1Wy+7du6lZsybbt29n//79bNy4kcqVKysdLYWvry9mZmZUr16dc+fOUbVqVaUjiUxMxssS/0ZPT4/hw4cTFhZG+fLlMTMzY+LEiURHRysdTWQiUmSJr+bn50fDhg2ZNm0aCxYs4NixY1hYWCgdK0VSUhLTp0+nR48erFixAg8PD3Lnzq10LJHJSUuW+BSFCxdm1qxZXL9+nefPn6NWq1m0aBEJCQlKRxOZgEorcwiIL3T79m0mTZrEhQsXcHV1pW/fvujq6iodK5WHDx/i6OhInjx58Pb2pkyZMkpHElmERqOhWLFihIWFUapUKaXjiCwiKCgIFxcXQkND+eWXX+jWrZs8sZyDSUuW+GzPnz9nxIgR2NjYYGFhQVhYGP369ct0Bdbu3buxtLSkXbt2HD58WAos8Vl0dHSwtrbmwoULSkcRWUjNmjXZv38/K1asYO7cuVhbW3P69GmlYwmFSJElPtm7d+/45ZdfqFGjBiqVilu3bjFx4kTy58+vdLRU4uLiGDZsGGPGjGHPnj1MmDAhUwwZIbIeuWUovlTTpk25dOkSI0eOpG/fvnTo0EGeVs2B5Moj/lNycjJr1qxBrVYTGBiIn58fixYtomTJkkpH+5tbt25hZWXFixcvuHLlCtbW1kpHElmYdH4XX0NHR4devXoREhJCw4YNadiwIYMHD+bZs2dKRxMZRIos8Y+0Wi0HDx7EzMyMNWvWsH37drZt20a1atWUjvY3Wq2WVatW0bBhQ5ycnNiyZQtFixZVOpbI4qysrAgMDCQ+Pl7pKCILy5s3L2PHjiU0NJTChQtjYmLCjBkzZBLyHECKLPFRV65coXnz5owePZpZs2Zx5syZTNsqFB0dTc+ePVm0aBG+vr4MGDBAOpqKNFGoUCEMDQ25cuWK0lFENlCsWDHc3d0JCAggPDwctVrNr7/+SlJSktLRRDqRIkukcv/+fXr37k27du3o1q0bN27coEOHDpm2aPHz88Pc3JzixYtz8eJFjI2NlY4kshmZLFqktcqVK7Nx40b27dvH77//Ts2aNdmzZw/ysH/2I0WWACAqKgpnZ2fq1KlDtWrVCAsLY8iQIeTKlUvpaB+l0WiYO3cuHTp0wNPTk6VLl5IvXz6lY4lsSDq/i/RiYWHBsWPHmDdvHlOmTKFRo0ZcvHhR6VgiDUmRlcPFxcXh6emJWq3m9evX3LhxgxkzZlCoUCGlo/2jZ8+e0apVK/bt28elS5fo1KmT0pFENvah87u0Moj0oFKpaNOmDVevXqVfv3506dKF7t27Ex4ernQ0kQakyMqhNBoNmzZtwsjICF9fX3x9ffn1118z/VhShw4dwtzcHFtbW06ePEnFihWVjiSyuYoVK6Krq8vdu3eVjiKyMV1dXfr160dYWBhmZmZYW1szcuRIXrx4oXQ08RWkyMqBTpw4Qd26dVm4cCHr16/Hx8cn0/dlSkhIwNnZmYEDB7JlyxZmzpyZaW9liuxFpVLJUA4iw+TPn59JkyZx69YtNBoNRkZGzJ49m9jYWKWjiS8gRVYOcuPGDdq2bcvAgQOZMGECFy9epFGjRkrH+k/h4eHUr1+f0NBQAgMDs0Rmkb1I53eR0UqWLMnixYu5cOECV65cQa1Ws27dOpKTk5WOJj6DFFk5wOPHj+nfvz9NmzalVatWBAcH071790z7xOBf/fbbb9jY2NC3b1/27NlDiRIllI4kciDp/C6UUr16dbZt28a2bdtYtWoV5ubmHDp0SPoIZhEyQXQ29vr1a9zc3PDy8mLgwIG4uLhkmQE63759y4gRI7hw4QJbtmzBzMxM6UgiB0tMTERfX5/Hjx9TpEgRpeOIHEqr1aZMFVahQgXc3d0xNzdXOpb4F9KSlQ0lJCSwZMkS1Go1jx49IjAwkDlz5mSZAuvq1avUqVMHgMuXL0uBJRSnp6dHnTp18PPzUzqKyMFUKhUdO3bkxo0bdO3albZt29KnTx/++OMPpaOJfyBFVjai1WrZsWMHJiYm7N27l0OHDrFu3bos8wSeVqtl0aJFtGjRgunTp7N27VoKFiyodCwhAJnHUGQeenp6DBkyhLCwMAwMDLCwsGD8+PFERUUpHU38Dymysolz585ha2uLq6srS5cu5fDhw1mqBejFixd06NCBDRs24OfnR69evZSOJEQq0vldZDaFChVi5syZ3Lhxg1evXmFoaMi8efNkrs1MRIqsLC40NJTOnTvTs2dPfvzxRwICAmjZsqXSsT7LqVOnMDc3x8jIiHPnzlG1alWlIwnxNzY2Nly8eFHmmROZTpkyZVixYgWnTp3i1KlTGBkZsXnzZjQajdLRcjwpsrKoiIgIhg4dip2dHdbW1oSGhtK3b190dXWVjvbJkpKSmDZtGr169WLVqlW4ubmRO3dupWMJ8VHFixenXLly3LhxQ+koQnyUsbExPj4+rFu3jvnz52NlZcXJkyeVjpWjSZGVxcTExODq6oqxsTF58uQhJCSE8ePHZ7l5+x48eECTJk1SxoBp1aqV0pGE+E8ylIPICj7Mgejs7Ez//v2xt7fn5s2bSsfKkaTIyiKSkpJYuXIlarWa4OBgLl26xPz58ylevLjS0T7brl27qFu3Lvb29hw+fJhvvvlG6UhCfBLp/C6yCpVKxbfffsutW7do0aIFTZs2ZcCAATx58kTpaDmKFFmZnFarZd++fdSuXZuNGzeya9cuNm/ejIGBgdLRPltsbCxDhw5l7Nix+Pj4MGHCBHR05FdQZB3S+V1kNXny5GHkyJGEhoZSokQJatasydSpU3n9+rXS0XIEucJlYpcuXaJJkyaMHz+euXPncurUKaysrJSO9UWCg4OpV68ekZGRBAYGUq9ePaUjCfHZ1Go1r1+/ltYAkeUULVqUOXPmEBgYyIMHDzA0NGTZsmUkJiYqHS1bkyIrE7p79y49e/akQ4cOODo6cv36dezt7bPENDj/S6vVsnLlSho1asTIkSPZvHmzjJgtsiwdHR1pzRJZWsWKFVm/fj0HDx5kz549mJiYsHPnTpmmJ51IkZWJvHz5ktGjR1O3bl2MjY25ffs2AwcOJFeuXEpH+yKvXr3i22+/ZcmSJZw+fZr+/ftnyUJRiL+SIktkB2ZmZhw+fJglS5bw008/YWdnJ7/X6UCKrEwgNjYWNzc3jIyMiI+PJzg4mKlTp1KgQAGlo32xCxcuYG5uTqlSpbh48SI1atRQOpIQaUKeMBTZScuWLQkICGDw4MH06NGDLl26EBYWpnSsbEOKLAVpNBq8vb0xNDTkwoULnD17lmXLllG6dGmlo30xjUbD7Nmz6dixI/Pnz2fJkiXkzZtX6VhCpJm6dety48YNYmNjAeQ2i8jydHV16du3L6GhoVhZWWFra8uwYcP4888/lY6W5UmRpZCjR49iYWGBl5cXv/32G7t27cLQ0FDpWF/l6dOntGzZkoMHD3L58mU6duyodCQh0lz+/PkxMTHh0qVLAHTt2pXLly8rnEqIr5cvXz4mTJhASEgIuXPnxtjYmFmzZhETE6N0tCxLiqwMdu3aNVq1asXQoUOZMmUK58+fx87OTulYX+3gwYNYWFhgZ2fHiRMnqFChgtKRhEhTHzoKw/+Pl5WYmMiRI0dkKiiRrZQoUYL58+dz8eJFbty4gaGhIatXryY5OVnpaFmOFFlpLDk5mUGDBhEZGZlq+cOHD/n+++9p2bIl7du35+bNm3Tt2jXLdwRPSEhg7NixDBo0iC1btjBjxows21FfiH9ToUIFBgwYwKVLl1I6vwcEBGBgYIC+vr7S8YRIc1WrVmXLli3s3LkTb29vateuzf79++UW+WeQIiuNeXh4EB4eTtGiRQGIjo7GxcUFMzMzypcvz+3btxk+fHi2mKMvPDwcW1tbbt++zdWrV2nUqJHSkYRIN6ampqxcuZLOnTtjYGDA+fPn8fX1ld97ke1ZWVlx6tQp5syZg7OzM82aNZNb5J9Iiqw0dPXqVTw9PVm3bh1JSUksXLgQtVrN8+fPuXbtGrNmzaJw4cJKx/xs9+/fp379+qmWbdy4ERsbG7777jv27NmTJaf3EeJzdezYkSFDhjB06FAKFCjAwYMHadiwodKxhEh3KpUKe3t7rl+/njKOY69evbh3757S0TI1lVba/dJEXFwcdevWZdy4ceTLl4+JEydiaGjI3LlzqVmzptLxvsoPP/xAuXLlcHV15e3btwwfPhw/Pz+2bNmCmZmZ0vGEyFBarZaePXvi5+fHn3/+yf379ylVqpTSsYTIUDExMXh6erJw4UK+++47pkyZQrFixZSOlelIkZVGnJ2duXTpEjExMWg0Gtzc3GjWrJnSsb5aWFgYtra2hIeHc+/ePXr06IGdnR2LFi3K0uN4CfE13r17h5GREW/evCEqKkrpOEIoJiIigpkzZ7Jt2zbGjx/PiBEjUg3bEx8fz4oVKxg+fHiW74P8JaTISgObN2/G0dERfX19unTpQu3atYmNjeXdu3fo6enh4uKSZX+5evXqhbGxMYUKFWLWrFksWrSInj17Kh1LCMUFBwdz/PhxRowYoXQUIRQXEhLCxIkTuXLlCj///DO9evVCR0eH5ORkLC0tGT58OP3791c6ZobLEn2ytFot8+bNY/369SnLzpw5g7OzMwkJCQBERkby448/Eh4enrLN7Nmz2bZtW8o2R44cYcqUKSmPoT59+pQhQ4bw6NEj4P1AmtOnT+fAgQMp2+zatYtZs2alPE1x7949Bg8eTERERMo658+fx8jIiCZNmpCQkMDNmzd5+vQpiYmJWbq1JygoiKNHj3L27Fk2bdqEn58fPXv25MWLFzKpqMgWNBoN48aNY86cOSnLdu/ejaOjI2/evAHePxncoUMHAgICAEhKSmLEiBGcOHEipcDauHEjP/zwA3FxccD7FmAHBwdu3boFvP9rfsCAAaxduzblOL/++itDhw5N+Sxdu3aN9u3bc+fOnfQ/cSHSmJGREbt27WLTpk0sXboUS0tLjh07hq6uLhs2bMDFxYW7d+8qHTPDZfqWLK1Wy+TJk9m+fTtv375l1qxZmJiY0K5dOypWrEjlypVZtWoVLVq0QE9PjydPnnDmzBmWLFnCvn37ePnyJcuWLaNYsWJ0796d8uXLY2ZmhpubG40aNaJo0aK8ePGCM2fOMG3aNPz8/Hjy5AmbNm1K+WIsWbIkzZs3x9nZmQYNGlC2bFkiIyM5depUphydPSoqivDwcKKjoz/6eq5cuahcuTIVKlRAV1f3H/fToEEDAgICsLOzo1q1aoSEhHDz5k3i4+NZu3YtnTp1Sq9TECLdaTQa+vfvT1BQEK9evaJ///6YmZnRt29fateuTWJiIuvWraNFixYYGRnh7+/PsWPH8PDwIDQ0lCdPnjBx4kRKlCjBiBEjMDIyomDBgixYsICmTZtiZmZGQEAAJ0+eZMKECbx8+ZLw8HDc3d2Ji4tj+vTpVKxYkUqVKjF16lSaNWuGtbU1ly9fxtfXV8beElmWVqtlx44dTJw4kWrVqjF37lyOHTvGrl27OHXq1L9edz5Iq+uY0jL9gEbu7u7s2LGDZcuWER0dzbBhw0hMTGTatGlYWVnh7OyMgYEBrVq1wtnZOaUzdsmSJfHy8iIiIoIff/wxZboXY2NjnJycUKvVdOnShaFDh7Jy5UqMjIyoVKkSS5Ys4fbt2zg6OgIwf/58ypcvz7Bhw1i/fj3ff/89ffr0YcWKFTRu3Jhr164pOhxDUlISvr6+/P777wQEBHD37l0SExOpWLHiPz7JmJiYyJMnT4iMjKRixYoYGhri4OBAp06dKFGiBABv377l4sWLVK1alQoVKlCtWjU6dOiAiYkJ5cqVy7K3P4X4YOrUqVy7do2FCxcSExPD4MGDef36NfPmzcPExISZM2diaGjIgAED6N+/P4cOHaJevXqYmJiwYMECXr58yZAhQ0hKSmLRokUYGBjg4uKCqakpI0eO5Ntvv2XHjh3UqlULKysr3NzcePjwIcOHD0dHRwcvLy9KlSrF2LFjqVOnDhMnTsTe3p7t27fTsGFD7t69S548eZT+MQnx2VQqFV27dsXBwYEVK1bQsmVLWrduTXJyMh4eHkyYMCHV+ul1HcsMMn1LloeHBytWrGDZsmXo6+vz8OFDoqOjMTU1Bd4/1efn50fDhg3R0Xl/99PPzw+1Wp3ypMPdu3dJSEjAyMgIeF9ABAYGYmdnh0qlQqvVcu7cOWrVqpXyhoaFhaGjo0O1atUAePXqFbdu3cLGxgatVsuKFSs4f/48V65cUazIioqKonnz5sTGxtKsWTPMzc2pUKEC+vr6n1QExcXF8fjxY8LDwzl9+jT+/v54e3tjb2+fAemFUNaaNWuYNm0ay5cvp0yZMrx8+ZLY2FjKly8PvP/iDwkJwcTEJOXzFB4eTpkyZVK6ATx//pzExETKli0LvL8teO/evZTvGnjfV6Vy5copnYGfPXuGSqVKaQWPjY3l4cOHqNVqtFotc+bM4enTp/j6+srAviLLOnHiBO/evSN//vwkJyezdetWfv/9d+Lj4zl+/HjKTCfZ/TqW6YusD7cLP7RmfRjkU0mrVq3C19cXX19fSpYsqViO0aNHc//+fSZPnpwmLUtBQUE4Ozvz6NEj+Qta5AgLFy7E09OTlStXZoq/fufNm0d4eDjHjh2jUKFCSscR4ov9+OOPPHjwIOUhsHfv3vHmzRv+/PNP6tWrx4kTJ4Dsfx3L9B3fVSoVQ4YM4dmzZ5lm0LOjR4/Sr18/RQusxMRENm7cyHfffZdmt+5q1qxJ1apV8fHxSZP9CZHZtW7dmjdv3vD06VOlowDvBzRu166dFFgiy/Py8mL//v2cOHECPz8/rl+/zr1794iJiUkpsHLCdSzTF1kPHz6kUaNGDBw4EHNzc6XjAO/7ic2bN481a9YoliE4OJgiRYqk+UTM9evX5+TJk2m6TyEyo/DwcJo2bYqTk1OmGTDY3d2dVatWsXDhQqWjCJHucsJ1LNMXWR9GTv+UsZnCwsLw9PT85H137tyZXbt2/W35tWvXGDx4MH/++edHt6tYsSIzZsxgwIABxMTEfPLx0tLNmzfT5ekjAwMDbty4keb7FSKzmT59OrVq1cLBweGjryclJaWaCPfVq1dYWloSFhaWar34+PiUYWHg/STxcXFxaDSaj+5Xq9USFxeXapsPSpcuzZQpUxg9ejRv3779ktMSIsvICdexTN+rcvLkyTRt2pSDBw/Spk2bf103MTGRzZs34+DgQPXq1f9z33ny5PnbPdsXL14wZcoU9PX1//Gx0OfPnzNnzhzmzJmj2DhYQUFBVK5cOc33W7VqVYKDg9N8v0JkNq6urjRs2JDdu3fTsWPHv73er1+/lHGu/qpXr15/W7Z27dqU1rDAwECGDBnyn8dfvnw5lpaWqZY9e/YMV1dXFi1aRMGCBT/1VITIknLCdSzTF1k1atTg+PHj1K9fnwoVKqQ8VTh79mwOHDjwt47wZcqUYcyYMamWRUZGMmbMGLp06ZJq+f/eA46KisLJyYnixYuzZMmSf/ySGzduHH369GH8+PFfe3pfLDw8PF3mDSxRogSxsbG8fv06S05mLcSnMjAw4OTJk1hZWWFgYECtWrVSve7u7k6BAgVS+ke9e/eOhg0b4uPjk/I0oUaj4cWLF6k+K7Vr1+bQoUPo6emlPPH8V1qtloSEBIoUKfK315ydnRk8eDDDhw9Py1MVIlPKCdexTF9kwfuO5gULFkw18Gfu3Llp1qwZ06dPJzExET09vb8VTUlJSejo6DB8+PD/HKzs3r17jB07lkKFCv1rgQVgamrKkSNHcHZ2VqyDanJycro83q1SqciVK9dHb2UIkd3s3buXwoULpxRNf1W6dOn//BxotVr09fXR09NLWaanp/fFTypaWFiwZ88enJycFL84CJHecsJ1LNMXWatWrcLDwwMvL69UT/MVKVKEfPnyERERgaOjI7lz5yYmJoZ3795RqlQp4H2R5ebmRsuWLTEwMPjX4xw4cIBvvvkGNze3/2ymHzt2LHPnzqVVq1acPn1axrIRIgtatWoV8+fPZ/ny5R8tiv744w+6du36t+X/24erTZs2uLq6AvD48WOAT/pO0Gq1xMfHU6FChZQWr1GjRuHm5pby3fLX4k0IkfVk+urg3r17lCxZ8m9N6wMGDEj5/+PHj3Py5El++uknZs6cSbt27VJeO3/+fKr+Fg8ePCB37tyoVCqSkpJ4/fo1ERERdOnShY4dOxITE5PSmf3Dl2C5cuVSfWnq6OhQvXp1/Pz80q0SF0Kkr3v37lGqVKmP3rZ79eoVJUuWTDUgaGxsLM2bN2f79u2UKVMGeN/pPT4+nqioKAoWLIizszOPHz/+W6t6TEwMefLk3+wbbQAAIABJREFUSfVd8aED/F/HxFKpVFSrVo3z58+TnJwsRZYQWVymrw5cXV15/PgxY8eOZf78+SmjJsP7L72zZ8+ybds2EhMTKVGiRKrxblatWsXq1auZN28eNjY2xMTE0L17d3Lnzo2Ojg7v3r1jyZIlLF++nKSkJBITE8mXL1/K9hqNhvj4ePbv35/qL92dO3eyYcMGTp8+nSkGO/tf9+/fJyoqKtMMeSFEZuTq6srDhw9xdnbGw8Mj1XdLv379ePr0aaoiJy4uDj09Pfr06ZOyLDk5OWWSeicnJ0qVKsXkyZMxMTFJdaxWrVoxceJEGjdu/K+ZfHx8WL9+Pb6+vqnyCJETvX37lvz583+0b2NWkemLLB0dHTw8PDAwMODq1atYW1sD72e99/LyQq1W069fP9RqNS4uLqxdu5ZixYrh7+/PzZs32bp1KxUrVgQg4P/Yu/O4GtP/j+OvUymEChGyZxl7tlR2QsqSZQaDvlkag2FsjWWmwlhjIio7MdaxE2Ushcq+DkJIZUsJ0V737w+Pzk8Irfcp1/Px+D4e3znnvq/rfVTnfM51X/d1XbyIqakprq6uwLu7hAYPHkz37t0JCQlhxIgR+Pj4fPHNbePGjUyfPv2LlyDzWma3iE+aNImwsDAOHjyYrQ2sVXwTAEHIFWpqaixZsoTq1atz+fJlTE1Nlc/t3r07w2iUr68vc+fOxd3dnRcvXtC2bVuOHj3KzJkzKV68OCVKlODIkSO0b9+eiRMnMnfuXO7fv0/Pnj0/+iJ29OhRjI2NKVOmzEeZ1qxZg6Ojo3I7L0Eo7DL7HNu2bRspKSk8evQIe3t79PT0stSuqnyOqXx5GBMTg4WFBb1798bExET5uLW1NZ6ennh6ehIWFoa9vT22trb079+fefPmUadOnQzzs77EyMiISpUqsWXLli8eO2fOHBwdHTl06FC2X1dOValSJdNVqidOnEi5cuWyNXH29evXSJKkEtsXCUJeio2NpXv37lhaWiq/vKV7v8DauXMnTk5OTJ06FV1dXWbMmMHKlSuZP38+CQkJ1K1bl4SEBOVyDGPGjGHixImsXbv2o7WuEhISWLt2LRMmTCAhIeGjTLNmzWLGjBkcO3YsD16xIKiWz32ORUdHM3jwYPr06cPVq1ez1K4qfY6pfJE1ceJEypQpw7hx4zK88T1+/BhfX1969uxJSEgI69at4969e5w6dQp1dXX69+9Pw4YN2bZt21f1Exsby9ixY1m7di1nzpz57LH169fH2dkZGxsb2RYjbdiwYabbDGlrazNw4MAMlz6/1v3796lbt26ubXEgCKpq4sSJaGtrM3ny5E/+vkdERDBhwgS8vLwoWrQoFSpUoEKFChgYGLBx40bevn1LpUqV+P7772nYsCFNmjTh2rVr1K5dm/j4eDQ1NT+aU1W0aFGWLl1KZGQkjo6OH/XZpEkT/vjjD3r06CHbe4sg5JfPfY5VrFiRLVu2sHv37iwv86BKn2MqX2SNHDmSK1eucPbs2QyPx8bGEhMTg4eHB/3792fy5MmEhYWxadMmSpYsyYsXL/j5559Zv349Bw8e/GwfZ86cYcCAARgbG2Nvb8/48eNxd3fn5cuXnzz+zZs3rFq1Cnt7e4oXL55rrzUr6tev/8lfzpSUFGJiYhg8eHC22r13755yLTJBKMwGDhzI1atXuXbtWobHExMTmTFjBn379qVIkSLK95TExESGDh1KiRIlKFGiBJIksXDhQv777z8aNWpEw4YNuXr1Kg4ODvTr148OHTp8csSqXLlyzJ8/H39/f7y8vDI8l5CQwJYtW/j++++z9SVJEAqSzD7HAGxsbLCysmLSpElZHpFSpc8xlZ+TZWZmxr59++jRoweenp7KuQrNmjUjMTERNzc3wsLCmDJlCubm5sTGxirv5KlSpQpTp07F2dmZkydPZrjrEN4NKe7du5ebN29ib2+PpqYmtra26Ovrs3DhQjZv3oyFhQWOjo4Z1tlycHDA3NwcNzc32Srlhg0bEh4ezosXLyhdurTycQ0NDTp06JDtdi9evPjRoq2CUBh17NiRzZs38+OPP7Jy5UrlytNaWloYGxvTqVMnOnbsCLz7YjVp0iRSUlJYtWoV8+fPJy0tDXt7ezQ0NOjcuTPa2tpoaGiQlpbGuHHj0NTUxNnZmWnTpn20Xk+TJk0YN24c1atXz/D477//jpGREWvXri3Qk30F4Wtk9jmW7lN3/n4NVfocU/kiC94N22toaGSYkO7i4sKJEycYNmwYixcvRkNDgwkTJnDt2jXat2+vnPBtaWlJuXLl0NTUJCYmRnn+o0ePePr0KZqamqxfvz7DNjzdu3enZcuWrF27lvbt23+0kGnp0qWJiIggOTkZTU3NPH71n6atrU3Pnj3ZvXt3huUscuLZs2ecOXOG7du350p7gqDq0v+2P5wk+/76WAEBAcTGxlKlShVWr17N/v370dHRYd26dezfvx8XFxfCw8MpWrQorVu3pm7dusr3KiMjI7Zu3crLly8/uqHmxx9//ChPamoq6urqKnGZQxDy2rfwOabu7OzsLHeIz9m9ezejR49m2bJlVK9enbi4ON6+fUvr1q0ZMGAATZo04fnz55QsWRINDQ2srKzo3r07RYoUUb6BlipVCh0dHZ4+fUpwcDAWFhYkJCRQtWpVHBwcMDAwIDIyEi0tLeW3x9TUVOV2G/DuMlx0dDTa2tq0adMGHx8f9u3bx/fffy/bN85GjRrh4OBAaGgoWlpalC1bNstrdqWlpREWFsbevXtxcXHBwcGBTp065VFiQVAdfn5+9O/fnwULFvDdd9+RmppKWlpahr/nixcv4ujoSI8ePVi6dCmhoaEsXLgQNzc3dHV1SUhI4O7du6xZswaFQsGLFy+4fv26cgQsJCSEsLAw1NXV0dTUxNTUlJSUlAz9SJJEcnIy6urqtGvXjr///ptz587Ro0cPUWwJhV5h/xxT+ZEsf39/ateuTbVq1YiNjWX06NFERkbi6elJ9erVWbJkCVu2bGHatGn06dOHM2fO0KtXL8zMzJg3bx6vXr1i1KhRxMfHM3z4cCRJYt68eRw4cIBZs2ahra3N8ePHmT59Ol27dsXJyYnIyEh++uknNDQ0WLFiBXp6evzxxx/4+/uzcOFCWrdujYWFBQsXLiQpKUm2uRNGRkZcuXKFjRs3sm7dOv777z9Kly5N5cqVMTQ0zHTLn+TkZJ48eUJ4eDjh4eGUKVMGa2trtm3bRuvWrfP5VQiCPDZv3kzjxo1p3LgxCQkJTJo0iUePHrFixQoMDAxwcnLC29ub4cOH8/PPP3P16lVGjhyJsbEx5cuX5+3btzg5OREfH8/Lly/R09MjODiYw4cPY21tjYmJCdWqVeP+/fv06tWLwMBAtLW1OXHiBJqamri7u6OtrY2LiwsHDx7E3d2dhg0bMnjwYKZNm8ayZctkm/MpCPmlsH+OKSRVWUwiE0lJSfTp04f4+Hiio6Np27YtzZs357fffqNNmzYEBwezdu1aevXqRZcuXThw4AA7d+7ExcWF1NRUQkNDGTBgAPr6+jg7O6OhoUH16tVxdXWlZ8+eWFlZcfDgQfbt28fUqVPR0dHh+vXrjB8/nri4ODZs2ICRkREpKSn88ccf9OnTh969e7N//358fX1VasHP1NRUIiIiCAkJ4e7du5lO3C9SpAjVq1fHyMiImjVroq2tnc9JBUF+sbGxdOnShUqVKhEZGUmFChVo1qwZnp6eVKpUiTNnzuDi4sKcOXOws7PD3d2devXqoaamRo0aNbh37x7Pnz/H2NiY4OBgzMzMCAgIIDw8HE1NTUaMGMH69etZsWIFM2fOpG7duuzbt49OnTpRo0YNAgMDqVevHsHBwTg4ODB27FhGjBjB6tWr2b59u8p8ExeE/FToPsekAiAxMVEaNGiQNG7cOCktLU2SJElatWqV1L59eykyMlKSJEm6ceOG1KJFC+no0aOSJElSfHy81LdvX2n69OnKc4YNGybp6+tLL1++lCRJks6fPy81b95cCgoKkiRJkl6/fi11795dmj9/vrJvJycnqVevXtLbt28lSZIkPz8/qVmzZtKlS5fy58ULgpBnXr9+LbVv317q16+flJSUJKWmpkqmpqaSpqamdOrUKUmSJCkgIEDS19eXdHV1pWfPnkkxMTGSqampZGtrK+nr60thYWHSpEmTpEaNGkmPHz+WunXrJjk5OUkVK1aUvL29JUmSpGfPnknGxsbSjz/+KJUvX17at2+fNHLkSKlly5ZSdHS0JEmStHPnTqlixYrK9zBBEAo+lR/Jyk0HDhxg1apVHDhwQO4ogiComPj4eIYMGUJUVBR79uxRrjD99u1bmjRpwoIFC+jTp4/y+Lt379KpUyfCwsIytDN79mxev36Ni4vLJ/s5d+4c1tbW7NmzB3Nz87x7QYIgyE7cIywIwjcvKiqKzp07o6mpia+vb4YtPBwcHDA1Nc1QYMG7zefNzMw+asvc3JzAwMBM+2rZsiV///03ffr04b///su9FyEIgsoRRZYgCN+0e/fuYWZmRtu2bfn7778z7DX477//cuDAAdzc3D46LzAw8JMjUS1btuTKlSskJiZm2meXLl1YsmQJlpaWPHz4MHdeiCAIKkcUWYIgfLPOnj1L69atmThxIvPmzcuwfMPLly8ZPnw4a9eu/eSK0wEBAZ8cySpRogR16tTh4sWLn+174MCBTJkyhS5duvD8+fOcvxhBEFSOKLIEQfgm7du3D2tra1avXs2oUaM+en7cuHH06NEDCwuLj557+fIlDx8+pHHjxp9s+0uXDN/vo3///nTv3p3Y2NisvwhBEFSaKLIEQfjmLF++nJ9//lm5ptWH9uzZQ1BQEAsXLvzk+UFBQbRo0SLTRRPTl3P4GrNnz8bY2Jg+ffp89hKjIAgFjyiyBEH4ZqSlpTFlyhSWL19OQEAAzZs3/+iYyMhIRo8ejZeXV6Zr72Q26T1d+kjW19y8rVAo8PT0pFSpUtja2n60z6EgCAWXKLIEQfgmJCQkMHDgQM6cOUNAQMBHmzPDuy1u7O3t+d///vfZIiqzSe/pKleuTJEiRbh///5XZVNXV2fz5s08e/aM8ePHf1VxJgiC6hNFliAIhd6LFy+Uc6v+/fdfypQp88njNm7cyIMHD/jclq4pKSmcP3+eVq1aZXqMQqHI0iVDgKJFi7J3714CAgL4888/v/o8QRBUlyiyBEEo1B48eICZmRmtWrVi69atFC1a9JPHhYWFMXnyZDZu3JhhGYcPXbt2jSpVqmRYS+tTvnby+/t0dHQ4fPgwXl5erFixIkvnCoKgekSRJQhCoXXhwgXMzc0ZO3YsLi4uGZZoeF9aWhrDhg1jwoQJmd4xmC6zpRs+lNWRrHQGBgb4+voye/Zsdu7cmeXzBUFQHaLIEgShUDp48CCWlpZ4enoyduzYzx7r4eHB27dvcXBw+GK7X5r0nq5JkyY8ePAg0w1uP6dmzZp4e3szevRojh8/nuXzBUFQDaLIEgSh0FmxYgUjR47k4MGD9OrV67PH3rlzB2dnZ7y8vDJdkuF9X5r0nq5IkSI0b96cs2fPfnXu9zVp0oR//vmHAQMGcOnSpWy1IQiCvESRJQhCoZGWlsbUqVP566+/OH36NCYmJp89PiUlhaFDh+Ls7Ezt2rW/2H5ERARxcXEYGRl9VZ7sXjJM165dO1auXIm1tTV3797NdjuCIMjjy1/bBEEQCoDExETs7OwIDQ0lMDCQsmXLfvGchQsXUqJECUaPHv1VfaRfKlQoFF91vLm5Oa6url91bGZsbGyIjo6ma9euBAQEUKFChRy1JwhC/hFFliAIBV5MTAw2NjaUKVOGY8eOUaxYsS+ec/XqVVxdXbl06VKmE+I/FBAQ8FWXCtOZmpoycOBAUlJSvupSZGZGjBhBZGQk3bp1w9/f/5N7KQqCoHrE5UJBEAq0hw8fYm5ujrGxMTt27PiqAisxMZEhQ4awaNEiKleu/NV9fe2k93SlS5fG0NCQ69evf/U5mZk2bRrt27enZ8+exMfH57g9QRDyniiyBEEosC5duoSZmRn29va4urqirq7+Vec5OztTo0YNhg4d+tV9vX37lps3b35yK57PMTMzy/J6WZ+iUChwdXXF0NBQOTomCIJqE0WWIAgF0uHDh+natStubm78+uuvX31eYGAgGzZsYNWqVV89twrg/PnzNGrUKNPFTDOT08nv71NTU2PDhg0kJCTw008/ie13BEHFiSJLEIQCZ/Xq1djZ2bFv3z769u371ee9ffsWW1tbPDw8KFeuXJb6zOqlwnTZWfn9czQ1Ndm5cyf//fcf06dPz7V2BUHIfaLIEgShwJAkid9//50FCxZw6tSpLBc9Dg4OmJqaYmNjk+W+szrpPV3t2rV58+YNjx49yvK5mSlRogTe3t7s3bs3x3cvCoKQd8TdhYIgFAhJSUkMHz6cu3fvEhgYmOWRqH///ZcDBw5w7dq1LPedlpZGUFAQa9euzfK56ZtFBwYG0r9//yyfn5myZcvi6+tL69at0dfXZ/DgwbnWtiAIuUOMZAmCoPJevnxJt27diI2N5fjx41kusGJiYhg2bBhr167N1vIHwcHB6OnpYWBgkOVzIfcmv3+oSpUq+Pj4MHnyZA4fPpzr7QuCkDOiyBIEQaWFh4fTunVr6tevz65duyhevHiW2xg3bhy9evXCwsIiWxmyOx8rXW5Ofv9QvXr12LNnD7a2tgQFBeVJH4IgZI8osgRBUFlXrlzB1NQUOzs73NzcvnqJhvft3r2bs2fPsmDBgmznyGmR1aJFC27cuEFcXFy22/gcU1NTvLy8sLGx4ebNm3nShyAIWSeKLEEQVJKvry8WFha4uroyadKkLC23kO7Zs2eMHj0aLy8vtLW1s50lu5Pe0xUrVowGDRpw/vz5bLfxJZaWlixatIhu3boRFhaWZ/0IgvD1RJElCILKWbduHba2tuzZsyfbk8UlSeKnn37Czs4OU1PTbGeJiori6dOn1K9fP9ttQO4v5fApgwcPZsKECXTt2pWoqKg87UsQhC8TdxcKgqAyJEnC2dmZTZs24e/vT506dbLd1saNG3nw4AHbt2/PUabAwEBatWqVrUuV7zMzM8PLyytHbXyNCRMmEBkZibW1NUePHqVEiRJ53qcgCJ8mRrIEQVAJSUlJ2NnZcejQIYKCgnJUYIWFhTF58mQ2btyIlpZWjnLldD5WuvQ7DNPS0nLc1pfMnTuX+vXr069fP5KSkvK8P0EQPk0UWYIgyO7169dYWVkRHR2Nn58f5cuXz3ZbaWlp2NnZMXHiRBo3bpzjbLlVZFWsWJFSpUpx586dHLf1JQqFgpUrV1K0aFHs7OzypbATBOFjosgSBEFWERERtGnThlq1arFnz54cTVAHcHd3Jy4ujilTpuQ4W1JSEpcuXcLExCTHbUHeLuXwIQ0NDbZu3Up4eDgTJkwQ+xwKggxEkSUIgmyuXbuGmZkZP/74I+7u7mho5Gya6J07d5g5cyYbN27McVsAly9fxsjIiFKlSuW4Lcifye/vK1asGPv378fPz4958+blW7+CILwjiixBEGRx9OhROnfuzIIFC3BwcMjWEg3vS0lJYejQoTg7O1OrVq1cyRgQEJArlwrT5dXK75+jq6uLj48Pa9asYc2aNfnatyB868TdhYIg5DsvLy8cHBz4559/aNeuXa60uXDhQkqUKMHo0aNzpT14Nx8rO5tJZ6ZBgwY8evSI6OhoypQpk2vtfkmFChXw9fWlXbt2lClTJldfkyAImRMjWYIg5BtJkpg9ezbOzs74+fnlWoF15coVlixZwvr161FTy523NUmScn0kS0NDAxMTE1m2v6lVqxYHDx7kp59+wt/fP9/7F4RvkSiyBEHIF8nJyYwcOZK9e/cSGBjId999lyvtJiYmMmTIEBYtWkTlypVzpU2A0NBQFAoF1apVy7U2IX8nv3+oadOmbNu2jf79+3PlyhVZMgjCt0QUWYIg5LnY2Fh69OjBkydP8Pf3p0KFCrnWtpOTE0ZGRgwZMiTX2oT/X7ohp3PFPpTfk98/1LFjRzw8PLCysuLevXuy5RCEb4GYkyUIQp56/PgxVlZWtGjRAg8Pj1y56y9dYGAgXl5eXL16NdeLody+VJjOxMSEixcvkpycTJEiRXK9/a/Rr18/oqKi6Nq1K6dPn8bAwECWHIJQ2ImRLEEQ8syNGzcwNTWlf//+rFy5MlcLrLdv32Jra4uHhwflypXLtXbTBQYG5mhT6Mzo6OhQo0YNLl++nOttZ8WoUaMYOnQolpaWvHr1StYsglBYiSJLEIQ8ceLECTp06MCcOXOYPn16ro80OTg4YGpqmid3yr1+/ZqQkBCMjY1zvW2Q/5Jhuj/++ANzc3N69+5NQkKC3HEEodARRZYgCLlu8+bN/PDDD2zfvp3BgwfnevtHjhzhwIEDuLm55XrbAGfPnqVp06ZoamrmSftyTn5/n0KhwM3NjfLlyzNo0CBSU1PljiQIhYoosgRByDWSJDF37lymT5/O8ePH6dChQ673ERMTw/Dhw1m3bh26urq53j7k3n6FmUkfyVKFrW7U1NTw8vIiNjaWn3/+WSUyCUJhIYosQRByRUpKCqNGjWLHjh0EBQXRoEGDPOln3Lhx9OrVi86dO+dJ+5B3k97TVa9endTUVMLCwvKsj6zQ0tJi9+7dXL58GUdHR7njCEKhIe4uFAQhx968ecMPP/xASkoKJ0+ezLW9/j60e/duzp49m6eTxlNTUzl79ixbtmzJsz4UCoXykmHVqlXzrJ+sKFmyJIcOHaJ169aUK1eOX375Re5IglDgiZEsQRBy5OnTp7Rv357y5ctz8ODBPCuwnj17xujRo/Hy8kJbWztP+oB3d0QaGBhQtmzZPOsDVGfy+/v09fXx9fVl4cKFbN26Ve44glDgiSJLEIRsu3XrFqampvTs2ZO1a9fm2bpPkiRhb2/PsGHDMDU1zZM+0gUEBOTJ0g0fUpXJ7x+qVq0ahw8f5tdff+XIkSNyxxGEAk0UWYIgZMvJkydp3749zs7OODo65voSDe/z8vIiNDQUJyenPOsjXV5Pek/XtGlT7ty5Q2xsbJ73lVUNGjRg9+7dDB48mHPnzskdRxAKLFFkCYKQZdu2baNfv378/fff2Nra5mlfYWFhTJkyhU2bNqGlpZWnfUHeT3pPp6WlhbGxscoWMebm5qxbt45evXoRHBwsdxxBKJBEkSUIwleTJAkXFxemTJnC0aNHsbCwyNP+0tLSsLOzY+LEiTRq1ChP+wJ48uQJL1++pG7dunneF6juJcN01tbWzJ8/n65duxIRESF3HEEocMTdhYIgfJXU1FTGjRvHqVOnCAoKwtDQMM/7dHd3Jy4ujilTpuR5XwBBQUGYmpqippY/3z/Nzc3x9PTMl76yy9bWlufPn9O1a1dOnTpF6dKl5Y4kCAWGKLIEQfiit2/fMnDgQOLi4jh16hQ6Ojp53uft27eZOXMmQUFBubrn4efk16XCdKamptja2pKamoq6unq+9ZtVkydP5tmzZ1hbW3P06FGKFy8udyRBKBAKzeVCPz8/FAoFCoUCNTU1KlWqxNixY4mPj1ces2PHDg4fPkxiYuInz9PV1aVLly4qPXwvCDkRFhZGz549KVWqFDVq1GDp0qUAtG/fXvl3oK2tjbm5OZcuXQLA0tKSSpUqoaenx6FDh9DR0WHHjh1oaGgQExOTpf6TkpIoWbIkf/75p/Kx9L41NTUxMjJi+vTpvHnzhqFDh9KoUSN69+6doY1z586hUCi4du1arve9bds2WrRoAcCECROoX79+nvZdvnx5Xr16RbVq1Zg+fbpy/8Dc7Ds7bGxssLKyyvBYs2bNOHPmDL1792bp0qVUqVKFYsWKYWFhwYMHD4CP34cNDQ2ZNm0aaWlpeZ5ZEFRRoSmy0kVERPDs2TM2btzInj17MtyNdOHCBVJTU/Hz8/vovLCwMI4dO4auri4dOnRQfsAIQmHSt29fypcvz61bt1i8eDGTJ0/m2LFjAIwdO5aYmBju3btH06ZN6dmzJzdv3uTixYvExcWxevVq5V5+x48fx9TUFD09vSz17+/vz5s3b/D29s7w+NixYwkJCcHJyYlVq1bRqlUrSpUqxbRp07h58yZPnjxRHnv8+HEMDQ2zPEfrS31PmzaNx48f4+HhAbybj5Qffffr14/OnTuzatUq5T6Pudl3dlhbW3Py5EmSk5OVj/n5+WFqasqLFy+YMGECs2fP5vr166ipqdGzZ88MhVRERAQvXrzgn3/+Yd26daxatSrPMwuCKip0RZaOjg76+vp06tSJAQMGKO/ciY6O5s6dO+jr63/0Rgegp6dHs2bN2L59O/Xr18fFxSW/owtCnoqJieHChQuMHDmSSpUqYWNjw88//8z9+/eBd3e76erqYmBgwKhRo3j06BHt2rXjt99+IyUlhfPnzyvbOnbs2EcjHV/D29ubLl26cO7cOZ4/f658XEtLiypVqjBkyBBmzJjBjRs3mDFjBu3bt6dkyZIcP348z/uuU6cONWvWZN++fdy+fZu2bdvmS98WFhakpqayZs0adu3alet9Z0f37t15+/Zthjsfjx07Ro8ePdDT06Ns2bJcu3aNmjVr4u7uzn///ZfhWB0dHXR1dTE1NaVt27YEBQXlS25BUDWFrshK9/TpU44dO0adOnUA8PHxoVy5clSqVOmTRVY6hUJBjx49VG4lZkHIKR0dHSpUqMD8+fOJiooCwM3NjZEjR2Y4Li0tDScnJxQKBevXr2fSpEkYGxtz9OhR4N2ob0hISLaLjcGDB1O1alV8fHw+ej4xMZE1a9agrq7OgwcPKFKkCBYWFsq+ExMTCQgIyJO+AwMD6datGxoaGgQGBuZb3+krv3fv3j1P+s6OChUqZPozv379OmPHjuXIkSO4uLhgZGREiRIluHoSgMsTAAAgAElEQVT16kfthIaGEhAQQJMmTfIltyComkJXZBkaGqKjo0OlSpWoWrUqc+bMAeDgwYPUr1+f0qVLc//+/c+u+2JoaMizZ8/yK7Ig5As1NTX279/PjRs3qFy5Mj/99BPh4eHK55cvX46Ojg6amprs3r2b1atXY21tDYCVlZXysuKxY8eoXLkyDRs2zFL/t2/fJiQkhLZt29K2bdtPftlxcnKidu3alCtXTvk3+H7fgYGBpKWl0alTp1zvOyAggLZt26Kvr5+vfX/33XdER0cTExOT633nRGY/8+joaCpVqoSPjw+enp6sX78eXV1doqOjlecaGhqiq6tL9erVadmyJePGjcu33IKgSgpdkRUYGIiXlxeSJLFo0SLKli1Lamoqvr6+1KtXj+LFi1O5cmUOHTqUaRt5uXK1IMipefPm3Lp1iy1btnD27FmaNGminH84ePBg+vTpQ7Vq1ejTpw+zZs1SXtqysrLizJkzvH37lmPHjtG9e/cs9+3t7U3lypWpWrUqbdq04ciRI6SmpiqfDwgIwMvLi5UrV2b4G+zevTsRERHcvXuXY8eO0b59+yzf3falviVJUq70nt99q6mp0apVKwIDA3O975zI7GeuUCiQJElZaE2fPp24uLgM2QMDA7l48SL//PMPQUFBLF68ON9yC4IqKXRLOFSpUoV69erRpEkTli1bhpubG4GBgcTExLB69WpSUlKQJAlvb28mTpz4yTYeP35MhQoV8jm5IOSt6OhoIiIiaNy4MTY2NlhbW9O9e3ccHBxITU3F398fQ0NDLly4QKlSpdDR0WHr1q2MGzeOli1boqenx8mTJzlx4gQrVqzIcv/e3t48fvwYXV1dUlJSePv2rfKyfFJSEra2tnh6eqKnp8fz58+Vf4MGBgY0a9aMo0ePcvz4cQYOHJirfQPcvXuXYsWKUb58+XzvG95dMjx9+nSu950Tmf3My5Ytq7yrtE6dOuzfv5+WLVvy4sUL5blVqlShRIkS1KxZkwcPHjBv3jwcHBzyNb8gqIJCN5KVbvz48WzYsIHY2Fi8vb2pWbMmy5Yto23btixbtoxTp07x+vXrT57r7e1Nu3bt8jmxIOStkydPYmJiohxFSZ/38+zZM65evUqRIkXw8fFBV1dXOVqRfneZQqHA0tKSpUuXEh0dneXLVrGxsZw6dYolS5Zw5coV/vvvP2rXrq28dHby5EnMzc3p3bs3R44cISUlhTZt2ijPt7KyYteuXZw/fz7L85K+1De8G3kxNzeXpW94t/L7oUOHcrXvnMrsZ960aVMuXryoPC59zbR169Zx7969j9p5//dIEL45UiFx4sQJCZBiY2MlSZKkhIQEqXz58tLSpUulBg0aSL/88ou0f/9+ydraWoqKipLU1NSknTt3Ks8LCwuTLl26JA0aNEgqUaKEFBwcLPMrEoTcFRkZKenq6krjx4+XwsPDpaCgIKly5cpS6dKlpSpVqkhjxoyRYmJipHv37knjx4+XFAqFdOnSJeX5O3bskACpW7duWe57586dkpqamvT8+XPlY+PGjZMaNGggNWrUSCpRooR0/fp1acuWLVK5cuWkkSNHZjj/3LlzEiDVrVs3V/tu166dNHbsWGngwIGSra2tLH2HhYVJ69atkwDJzs4u1/rODZ/6me/fv18qUqSI5OXlJd29e1eysLCQjI2NpW3btklly5aVACkiIkJ6/vy5dPToUcnQ0FDq1auXLPkFQW6FtsiSJElycnKSqlevLgHS4cOHlUWWJEmSiYmJZGdnpzwPkHR1daVevXpJ169fl+tlCEKeCgwMlMzMzCRtbW1JX19f0tbWltzd3aV27dop/w6KFy8uNW/eXNq5c2eGc1++fCkVKVJEcnNzy3K/dnZ2komJSYbHDh8+LAGSurq6BEhFihSR6tSpI7m4uEipqakZjk1LS5PKly8vTZw4MVf7Tn9/AKSqVavK0nf6665UqZJ06tSpXOs7N2T2M/fw8JAMDQ0lLS0tqXPnzlJoaKgkSe8KyPR/T4VCIVWsWFEaMWKEFBkZKUd8QZCdQpIkKf/GzeR14MABVq1axYEDB+SOIgiy2rNnD/b29nh5eWVrEntuGTx4MHp6eixbtky2DDExMVSpUoWYmJh8277nU3755ReqVKmSb/s05hUnJycOHjzIiRMnKFWqlNxxBEFWhW7iuyAIn+fm5saCBQvw8fGhWbNmsuXYtWsX586d48qVK7JlgHebQrdo0ULWAgveTX7fvn27rBlyg7OzM8+ePcPGxoZDhw6hpaUldyRBkE2hnfguCEJGaWlpTJw4EU9PTwICAmQtsJ49e8aYMWPYuHGj7JsNp096l5uZmRkBAQEU9IsLCoUCd3d39PT0GDx4cIblKgThWyOKLEH4BsTHx/P9999z8eJFAgMDqVatmmxZJEnC3t6eYcOG0apVK9lypEtfH0tuVapUQUtL65N36BU06urqbN68mejoaMaOHVvgC0dByC5RZAlCIRcVFUXnzp0pUqQIR44cyfKmzrnNy8uL0NDQDJu3yyU5OZnz589jamoqdxTg3WhWYdnSS0tLi71793L27FlmzpwpdxxBkIUosgShELt37x7m5ua0adOGzZs3yz4/5uHDh0yZMoVNmzbJngXg2rVrVK1aFV1dXbmjAP9/ybCwKFWqFIcPH2bz5s14eHjIHUcQ8p0osgShkDp37hytW7dm/PjxzJ8/HzU1ef/c09LSsLOzY9KkSTRq1EjWLOlU5VJhuvTNoguT8uXLc+TIEebOncuOHTvkjiMI+UrcXSgIhdD+/fsZPnw469ato0ePHnLHAd5tQJ2QkKBSSxQEBARgaWkpdwylxo0bExoaysuXL1VmdC03VK9enUOHDmFhYUHp0qXp3Lmz3JEEIV+IkSxBKGTc3d0ZNWoUhw4dUpkC6/bt28yaNQsvLy/U1dXljqOkaiNZRYoUoXnz5pw5c0buKLmuUaNG/PPPPwwaNIgLFy7IHUcQ8oUosgShkEhLS8PBwQE3NzdOnz5NixYt5I4EQEpKCkOHDmXmzJnUqlVL7jhK4eHhJCQkYGRkJHeUDArT5PcPtW3bltWrV9OjRw/u3LkjdxxByHPicqEgFAIJCQn873//IyIigsDAQMqUKSN3JKX58+ejo6PDzz//LHeUDNJHsRQKhdxRMjAzM+Ovv/6SO0ae6dWrF1FRUXTt2pWAgAAqVqwodyRByDOiyBKEAu7Fixf07t0bAwMDjh49StGiReWOpHT58mXc3Ny4dOmS7BPvP6RqlwrTmZqacu7cOVJSUmRfhT6vDB8+nOfPn9O1a1dOnjwp+7IigpBXVOtdTxCELHnw4AFmZma0bNmSbdu2qVSBlZiYyNChQ1m8eDGGhoZyx/lIQECASqz0/qHSpUtTuXJlrl27JneUPPXbb79hYWFBjx49iIuLkzuOIOQJUWQJQgF14cIFzM3NGTNmDIsWLVK5kSJHR0dq1arF4MGD5Y7ykbdv33Lr1i1Ztxb6nMK4lMOHFAoFixYtonr16vzwww+kpKTIHUkQcp1qvSsLgvBVDh48iKWlJR4eHvzyyy9yx/nI6dOn2bhxIytXrlS5OU/wbg2xxo0bq9TI3/sK8+T396mpqbFu3TpSU1MZOXKk2H5HKHREkSUIBczKlSsZOXIkBw4coHfv3nLH+cibN2+wtbVlxYoV6Ovryx3nk1R1Pla6wrby++cUKVKEf/75h+DgYKZOnSp3HEHIVaLIEoQCIi0tjWnTprFo0SJOnTqlEpsrf8qUKVNo06YNvXr1kjtKplS9yKpduzZv374lIiJC7ij5Qltbm4MHD3LgwAEWL14sdxxByDWF89YVQShkEhMTGTZsGA8ePCAoKIiyZcvKHemTfH19OXTokEpP2k5LSyMoKIi1a9fKHSVTCoVCecnw+++/lztOvihTpgy+vr60bt0afX19hg4dKnckQcgxMZIlCCouJiaGrl27Eh8fz7Fjx1S2wIqJiWHEiBGsW7cOHR0dueNkKjg4GD09PQwMDOSO8lnfwuT3D1WuXBkfHx8cHBzw9vaWO44g5JgosgRBhT18+JDWrVvTpEkT/vnnH4oVKyZ3pEz98ssv9O7dm06dOskd5bNUdemGD30rk98/9N1337Fv3z7s7Oy+ydcvFC6iyBIEFXXp0iXMzMwYOXIkS5YsUak9/z60c+dOzp07x4IFC+SO8kWqPh8rXfPmzblx48Y3uYaUiYkJmzZtwsbGhv/++0/uOIKQbaLIEgQVdPjwYbp27Yqbmxu//vqr3HE+6+nTp4wdO5aNGzdSvHhxueN8UUEpsooVK0bDhg05f/683FFk0bVrV1xdXbG0tOThw4dyxxGEbBFFliComDVr1mBnZ8e+ffvo27ev3HE+S5Ik7O3tGT58uMre7fi+58+f8+zZM+rXry93lK/yLS3l8CmDBg1i8uTJdOnShefPn8sdRxCyTNxdKAgqQpIkHB0d2bp1KydPnqR27dpyR/qiDRs2EBYWxs6dO+WO8lWCgoIwMTFR6Uuv7zM3N2f9+vVyx5DV+PHjiYyMxMrKiuPHj1OiRAm5IwnCVxMjWYKgApKSkrC1teXIkSMEBgYWiALr4cOHODg4sHHjRjQ1NeWO81UCAwMLxKT3dKampgQFBZGWliZ3FFn9+eefNG7cmD59+pCUlCR3HEH4aqLIEgSZvXr1CktLS16/fs2JEycoV66c3JG+KC0tDTs7OyZNmkSjRo3kjvPVAgICCsR8rHQVK1akVKlS3L59W+4oslIoFHh6eqKtrY2tre03X3QKBYcosgRBRuHh4bRu3ZrvvvuOXbt2FYiJ4wDLli0jMTGRKVOmyB3lqyUlJXH58mVMTEzkjpIl3+J6WZ+ioaHB1q1befLkCePHjxf7HAoFgiiyBEEmV69exczMDFtbW5YtW1Zg5gkFBwcze/ZsvLy8CkxmeLckRq1atShZsqTcUbLkW5/8/r6iRYuyb98+Tp06xZw5c+SOIwhfJIosQZDBkSNH6Ny5M4sWLWLy5MkoFAq5I32VlJQUbG1tmTVrFkZGRnLHyZKCsnTDh8RIVkY6Ojr4+Piwfv16Vq5cKXccQfgscXehIOSz9evXM3XqVHbv3k2bNm3kjpMl8+fPR0dHh59//lnuKFkWGBhInz595I6RZQ0aNODx48dERUWp7JZK+c3AwIAjR47Qpk0bypYtq/JLnQjfLjGSJQj5RJIknJ2dmTVrFn5+fgWuwLp8+TJubm6sW7euwIy8pZMkqcBNek+nrq6OiYkJQUFBckdRKTVr1sTb25uff/6ZEydOyB1HED5JFFmCkA+Sk5MZNmwYBw8eJCgoiO+++07uSFmSkJDAkCFD+OuvvzA0NJQ7TpaFhoaiUCioWrWq3FGyRVwy/DRjY2O2b9/ODz/8wOXLl+WOIwgfEUWWIOSx169fY2VlxfPnz/Hz88PAwEDuSFnm6OhInTp1+PHHH+WOki3pm0IXtBG4dN/qZtFfo0OHDqxYsQIrKytCQkLkjiMIGYg5WYKQhx49eoSVlRWtWrVi+fLlaGgUvD+506dPs2nTJq5du1Zgi5SCOuk9nYmJCRcvXiQpKanALPyan/r06UNUVBRdunQhICCAChUqyB1JEAAxkiUIeeb69euYmpoyYMAAPD09C2SB9ebNG2xtbVmxYgX6+vpyx8m2grbS+4d0dHSoWbMmV65ckTuKyrK3t2fYsGFYWlry8uVLueMIAiCKLEHIE8ePH6dTp07Mnz+fqVOnFtgRoClTptCmTRt69eold5Rse/36NSEhITRp0kTuKDki1sv6shkzZtC2bVt69epFfHy83HEEQRRZgpDbNm3axIABA9ixYweDBg2SO062+fj4cOjQIZYuXSp3lBw5e/YszZo1K/CX2cTk9y9TKBQsWbKEihUrMmjQIFJSUuSOJHzjRJElCLlEkiTmzJnDH3/8wYkTJ2jfvr3ckbItJiaGESNGsH79enR0dOSOkyMFdemGD6VPfhfbyXyempoaXl5exMXFMWrUKPHvJchKFFmCkAuSk5Oxt7dn165dBAYGUr9+fbkj5cjYsWPp06cPHTt2lDtKjhX0Se/pqlevTmpqKg8fPpQ7isrT1NRk165dXLt2jd9//13uOMI3rODNxBUEFRMbG8v3338PgL+/f4HbG+9DO3fu5MKFC4Vi3aHU1FTOnj3Lli1b5I6SYwqFQnnJsFq1anLHUXklSpTA29ubNm3aoK+vz6+//ip3JOEbJEayBCEHnjx5Qrt27TA0NGT//v0FvsB6+vQpY8eOxcvLi+LFi8sdJ8f+++8/KlSoUGi2oxGT37NGX18fX19fFi9ezObNm+WOI3yDRJElCNl08+ZNTE1N6du3L6tWraJIkSJyR8oRSZIYOXIkI0aMoFWrVnLHybbbt28TFRUFFPylGz4kJr9nXdWqVfHx8WHixIn4+PjIHUf4xhT6IiskJITZs2d/9PiFCxdYtmyZDImEgiYlJYVDhw5leMzPz4/27dsze/ZsZsyYUSCXaPhwQvD69euJiIjA0dFRpkS5Y+PGjSxfvhzIOB8rLS1Nzli5wtjYmDt37hAbGyt3lAKlfv367NmzhyFDhnD27Fm54wjfkEJfZJUvX55ly5YRHByc4fEpU6YU+Es7Qv44ePAg8+fPV/73li1b+P7779m6dStDhgyRMVnOzJgxg7///ht4t7ffb7/9xsaNGwvFUgcnT54E/v/OwsjISOrUqUNERITM6XJGS0sLY2NjZaFw+vRpbt++LXOqgsHMzIwNGzbQq1cvbt26pXzcxMSEuLg4GZMJhVmhL7JKlizJhAkT+PPPP5WP+fn5ER4ezuDBg2VMJhQUK1asYOTIkUiSpFxc9NixY3Tq1EnuaDly9epVdHR0SEtLw87OjsmTJ9OwYUO5Y+WYubk558+f5+HDh7x69Yrq1avTt29ffvjhhwK5uTW826A7fRXz9y8Zzp49+6MvkELmrKysWLhwId26dSM8PByAokWL4u/vL3MyobAq9EUWvLsd/ciRI8pvsTNnzuT3338vkNucCPnr3r17XLx4ERsbG0aPHs3WrVsJCgoqFMXIvXv3qFmzJsuWLSMpKYnJkyfLHSlX6OjoULt2bf7++29atWrFL7/8QpkyZZg1a5bc0bItICAAExMTXr58qZz8npycTFBQEG3atJE7XoEydOhQxo0bR5cuXYiOjsbS0pLDhw/LHUsopBTSN7JS27x58/D19SUxMZHnz58THBwsiizhi3777Tfi4+O5f/8+SUlJ7Ny5k1KlSskdK8dSU1PR1tbmzJkzdO7cmTNnzlC+fHnc3Nzo2bNngS8iJ0yYwIULF9DV1SU0NJTAwMACPz3g119/JTg4mPXr11O3bl18fHwYNWoUV69elTtagfTbb7/h7++Pq6srtra23LlzR+5IQiH0zRRZsbGxVK5cmbS0NNzc3Pjf//4ndyRBxSUmJlKpUiUMDAxo3rw5I0aMwN/fn2PHjlG2bFl27Nghd8Rse/jwIebm5lSsWJGhQ4eioaHBzJkz6dKlC0uWLEFPT0/uiDmyd+9eBgwYQPHixbl48SLVq1eXO1KOpaSkYGlpSaNGjThw4ADW1tYkJyeLG3iy4N9//+X333/H1taWAQMGMGnSJJ48ecLVq1c5ffo0NWvWlDuiUMh8E5cL4d3cLBsbG9LS0sRcLOGrLF++nJiYGJKTk9m7dy9jxowhOjqaSZMmsXbtWrnj5ci9e/fQ0NAgJSUFDw8PduzYgbe3N15eXgW+wAJo3bo1SUlJbNmypVAUWAAaGhps376d/fv3U65cOY4ePUrbtm3ljlWgdOrUidmzZ+Pv70+NGjVISEjg1atXFCtWTFwyFPLENzOSBe8mj4aGhlK3bl25owgFwJgxY7h58yajRo2iQ4cOlCtXTu5IucbR0ZHZs2djZGSEq6srVlZWBXIZis959epVgd938VNu3bqFiYkJ8fHxREREUL58ebkjFUjR0dFs3ryZ1atXc+PGDYyMjMQlQyHXfVNFliAI72zbto3z58+zYMECMTexAFq7di0zZszg6dOnckcp8CRJwt/fn9OnT4t9DoVcV6iLLEmSePr0Ka9evfrk8xoaGlSuXBktLa18TiZ8TkpKCuPGjVPeEaZQKNi6dSvbt29nw4YN6Orqcv/+fX766SdmzpyJmZkZycnJjBo1ijp16uDg4ADA6tWrOXr0KOvWrUNbW5sbN24wfvx4Fi9eTOPGjYmPj2f48OG0bt2a0aNHA+Dq6srVq1dZuXIlWlpanD9/nqlTp+Lu7i5GQGUiSRKxsbFERUUp//fmzZsstVGkSBHKlClD2bJlKVu2LKVLl1b54lKSJIKDg/nuu++UjyUlJfHw4UNq1aqlfOzNmzdER0dTtWpV5WMvXrwgMTGRChUqKB97+vQpmpqalC5dOn9egIpas2YNenp69O3bF3i3MLWPjw9Tp05FQ0OD169fM3fuXEaPHk2VKlWQJAkPDw9q1KiBpaUlAKdOneLMmTNMmjQJNTU1oqKicHFxYdKkSZQrVw5JknB1daVp06a0b98eeDcfLDg4mLFjx6JQKHj06BFLly5l2rRpheISvfBpharIun37tnJz27t37/LgwQOKFSuW6SWDpKQkIiMjMTAwoGbNmtStW5cePXrQqVOnAr8gY0GVkpLCkCFDCA0NJSYmhn79+tG8eXNGjhxJixYtePHiBRs2bKBr1660aNECPz8/Dh8+zMKFC3ny5AmPHj1i7NixlC1blqlTp9KgQQPS0tJYunQpFhYWmJubc+rUKf79918cHBxITk7m1q1bzJo1i/j4eFxcXKhevTp6eno4OjrStWtXOnbsyMmTJzlx4oRKFFqSJHH16lUuXbrEnTt3uHPnDiEhIbx+/fqTx2toaFCtWjVq1apF7dq1qVOnDu3atUNbWzufk3/e48ePOXPmDOfPn+fChQs8fvyY6OhoXrx4gaamJnp6eujq6qKrq0vx4sWzdHkzOTmZV69e8fLlS2JiYnj16hUlS5ZUFl7169enZcuWNG/eHGNjY9TU5J2uKkkSY8aMYdWqVUyYMIGFCxcSFxdH7969OXnyJIsXL2bs2LFERkbSpUsXQkJC2LRpEzY2Nty9e5fOnTvz9u1b9u3bh7m5OWfPnsXa2poSJUrg7+9PlSpVZH19cpk/fz4rVqwgLi6OZcuW8d1339GpUyfKlStH06ZN8fT0pFu3brx+/Zq4uDhOnz7N6tWrWb9+Pa9fv2bTpk3o6upibW1N2bJlsbCw4M8//6RDhw6kpqYqR8X+/PNPDh48SHR0NHv37iUxMZEBAwagq6vLgAEDGDduHG3atKFYsWIoFAqOHz8uCq1CSrW/yn2lhIQE+vXrx/nz5+nQoQMtW7akX79+GBoaUqJEic+em5KSwpMnTwgPDyckJITp06fz5MkT9uzZg6mpaT69AiHd9OnTuXfvHq6ursTFxTFq1Cjc3d1ZtmwZderUYd68eTRo0IBffvmFwYMH06pVK9q0aYOxsTGLFy8mJiaGUaNGkZiYiIeHB5UrV8bR0RFjY2N+++03bGxsaNiwIc2aNaNt27bMnTuXR48eMXr0aNTU1FixYgX6+vpMmTIFU1NTnJ2d6dKli7IwefjwIUWLFpXt38fT05OFCxeSlpZG48aNqVSpEs2bN8fGxibTpSWSk5N59OgRERERnDt3jm3btnHr1i169OiBm5sbZcqUyedX8bFly5bh6OhI48aNqVOnDt27d8fAwABdXV10dHRyfbQ5NTWV2NhYXr58yYsXLwgJCeHQoUMsWLCAihUr4uvrK1sRml5gBQQEsGvXLv744w+eP3/OrVu3qFChAtu2bWPChAk8ePCAffv20bFjRyZPnsxPP/3ElStXWLlyJSNGjKB8+fL07NmTCRMm4Orqyh9//EF4eDjt2rX7Jgut5cuXs3LlSjw9PXn58qVyRGnixIm0adOG8ePHY2RkRIsWLXB1dWXdunU0adKEokWLsnLlSh4/fqzc4SH9d3XMmDHUrVuX9u3bM3nyZJYuXUq9evXQ0dFhxYoV3Lp1CxsbG+VCxtWqVWPUqFGsWbMGa2trRo0axZIlS+jYsSPnzp0r8PufCh8rFCNZs2bNws/Pj3nz5uXKJQA/Pz+WLl1KaGio7N9ovzV///03U6ZMwcPDgypVqvDq1Svi4+MxMDAA3n04PnjwACMjI+U5YWFhlCtXTln8vHjxgtTUVPT19YF3RUZ4eDg1atRQnvPgwQMqVaqkHLGMiopCoVAoC46EhASePn1KtWrVSE1NZfbs2cTFxeHr6yvbZabt27czbdo0nJ2dqVevXo4mqsfExLB69WoiIyM5ceJELqbMuqioKGrWrMnmzZszXN6SQ1paGtOnT6dLly5MmTJFlgwPHjygZs2a/P3339SpU4e4uDjmzJlDxYoVGT16NAqFgujoaGbPno2pqSk//PAD8G5Zjrlz59K/f386d+4MwLVr13Bzc2PMmDEYGxuTlpbGiBEj6N69O/PmzZPl9cllzpw5bNmyheXLl1OqVClCQkJ48eIFLVu2BN5ddvXz86Nbt25oaGggSRLHjx+nfv36yvefmzdvkpSURJMmTQB4+fIlQUFBdO3aFTU1NSRJwtfXlxYtWijfS65evYq6ujoNGjQA4Pnz51y5coXOnTujUCjYsGEDPj4+3LhxQ1xBKYQKfJElSRJGRkY4OTlRv379XGt38ODBeHp6Kq+nC/ln9erVODk5sXr1auWbm5zmzp1LVFQUhw8fpnjx4rLlMDMzo2/fvrn2O5mamkrPnj05fvw49erVy5U2s8PDw4ODBw9+ciN3OVy4cAF3d3euXbsmWwYPDw9mz57N8uXLqVatWq60mZKSwuzZs3n9+jXe3t4FfnHWrJIkiUmTJuHr66sstOS2fv16fH198ff3p2LFinLHEfJAgR+mefDgAXFxcZl+SERERJCUlJTlduaNml4AACAASURBVNu2bSvWTZFJy5YtSUhIICYm5ovHJicnK/9/WlpanuQJCQmhVatWshZYz5494+bNm5ibm3/V8aamphw4cOCzx6irq9OpUyd27dqVGxGz7cSJE7Rq1Spf+vL19SUyMvKzxxgbG392jlt+GD16NIMGDcqw5+qnXLhwgaioqK9q08fHhwsXLnD48OFvrsACUCgU/Prrr4SHh3Pv3r086yc5OZnLly9neG/KzOHDhxk5cqQosAqxAl9kBQcHU6NGjUwvnfz111/88ssvwLvLSO7u7qSmpn6x3Ro1amTYqV3IH9evX8fCwoLffvstw11VAPHx8cyZM4fQ0FDg3RtUv379lM/v27ePH3/88aPiLH0Ca0pKCvBuIc7mzZsTFhb2VZkWLVrE7t27mTlzZg5eWc7cuHGDWrVqZTpnIy0tLUORmT5R/Evq1Kkj64gNwJ07d3JttOZzwsLCcHR0JDo6+rPHqaurU7VqVVnXTDp06BBeXl6MGjUq02MSEhJwcHDgyJEjX9Vmhw4dqFy5Mvb29sq/hW9JWFgY7dq1w97eHmNj42y3k5KSQkJCQqbPJycnM3r0aG7evPnFtlxcXHB1dWXNmjXZziOotgI/8f327duZTuBMSUnhypUrTJw4EXh3l9W+ffsoXbo0CoUCd3d31NXVARg/fjw2NjbKc6tVq1bgV/UuiBYsWEDTpk2Vc0reV6xYMUJDQ3F3d8fFxYV69erx6NEjQkNDMTQ0ZMOGDbRt2/aj4uLKlSv8+uuvuLq6Ku/oAb56MnXp0qWZPHkyo0ePZvLkybJMiL5161aGW/Q/NHHiRPT09HBycgLe/a6nz1F7+vQpx44do3Tp0spb0NNVr16df/75J++Cf4EkSYSEhHzytd24cYMxY8Yo/1tLSwtfX1+2bduGq6ur8ucoSRIpKSkEBAQA7+4gO3/+vPJvOyUlBU9PT7Zv3466urry36h48eKsWLHikzcypBdZzZs3z/XX/CWPHj3CxsaG5cuX07Rp04+et7a2zrA+1l9//cVff/31yba2b9+u3CpGW1ubJUuWMHLkSObPn//NrQk1ffp0atWqxcCBAz/5vLOzM4GBgejq6iofS0xM5PHjxx/tGlCzZk3mzZvH0aNHlb+L78/fLV68OI6Ojsr3mKSkJCRJYt++fRnaqVq1Ko6Ojtjb2zNo0CBZR8uFvFHgi6xbt25lWmT5+fmRmJhIx44dkSQJbW1txo4dS1JSEpaWllhZWVGyZEnlukrvMzQ0JCwsjJSUFJVfT6cwcXFxoW3btmzatEl5J8/7RowYwYMHD4B3b1BbtmyhcuXK7NmzB3V1deWo5fuCgoJo1qwZbdq0ybTf5ORkUlNTP/mBGxoaipOTE15eXrLdcXbz5s3PFlnFixf/KJu3tzfLli3j7t27qKmpMWzYsI/Oq1atGiEhIaSmpiqLkvz0+PFjihcv/sm7gNXU1ChZsiQHDhzg8ePHyg9HTU1NmjVrhoeHh7KN9z84J06cSFpaGl26dOHAgQMUK1aM+/fvc/z4cQ4fPoyOjg5z586lWLFimd4pamhoSHBwcB684i/T19fH0tISLy8v6tWr91FGTU1N3NzcMDMz+2w7JiYmH02kPnr0KC9evKBHjx65nlvVOTs70759e/bs2ZPhC3U6hULBgAEDsLS0ZPz48cC7Av3D0eMePXoo35s6d+6s/EJ448YNNmzYwMKFC5VXVuzt7bG3t8+0WH/8+DFz587F1dVVFFiFVIGvHqKiojLcNfa+3bt3o6+vT/HixTlz5gwzZszg2LFjnzz2w0KqaNGiaGlpERsbK9Yv+T/27jwuqnr/H/hrYFgElFWRTRARRVzQQAUNNbeE5GaWeUvzWpl1xT3NpcS0NEMzF1zQm17TyuWqpShqKGACIgqo4QIiIqKyr7IMzPn94W/O1xFwZRgYXs/HYx7JmTNnPtNsr/l83p/PaUBWVlY4deoUXF1d4erqKv6S//LLL/HXX3+J+23atEnpdmVlZdDW1sawYcMAPCwSX7ZsGWQyGY4ePYri4mL06dNH6TZ+fn7iv6urq9G7d2/xi/tRc+bMwZw5c9R6zsu7d++Ks6Bqo62tjZs3b2L58uWIiYlBYWEhcnNz8c9//lNcbLW2QGFgYABdXV0UFRWp5XVeUFCg1HPwqMe/3BTv0dqGTB8tF9DV1UVcXBwcHBxgbGyMsrIyfPHFF5gxYwaMjY1RVFSE0NBQ7N69u852GRsbP1NNoCro6upi3759eO+997BkyRIsW7ZM6frn+dH3aHCOjo5GUFAQIiIiagzFNwdOTk6IiIhAr1694OjoiB49eihdr6WlBYlEArlcjpKSEhw5cqTGMX755Rel18WXX34JHR0daGlpobKyEsnJyWId3YMHDxAfH4/Dhw/j6NGjqK6uhoGBgdKPesXSG4pQR5qnyYcsALXWYyUkJCA2Nha2trYAACMjo6eumUXqJwgC1q5dCxsbG6VlGqqqqjBmzBhxZfYn2bx5s1i3deDAAejp6SE0NFT8csrMzISfnx/++OMP8bxvcrm8zlo9Hx8fBAcHY9y4cWo9T9zjr/OcnBwcPHgQFy5cQEJCAlq1agVHR0csWLAA8+fPxwcffCD+gi4tLdWoX8qJiYl48803AaDW523//v3iY2/RogW+++47fPTRR/jPf/6D0tJSSKVSTJ8+HYWFhXj33Xdr9PKp+zyO9+7dQ0JCAoYPH/7E/fr27YvHJ4jv2bOn1l5PS0tLSCQSnDt3rlmGLEEQsH37dlhaWtY6+qEIWdra2sjJycHgwYNr7FNZWan0Y+u9996Drq5uncF38uTJ4r9lMlmN58rb2xu//fYbJk+eLC45Q5pFI0LW46qqqrBy5Up4enri9u3bAB7++lX3Byc9XWBgIH7//Xds2LBBaYq1k5MTrK2tUVlZCblcDl1d3TrXMOvYsSMMDAyQl5eHLVu2YNy4cU/99a+lpVXn8SZOnIiqqioMGjQICQkJjWYtG5lMhgsXLsDLywva2tro0KEDZsyYAaBmSCgtLRVrmJqSe/fuYeDAgRAEQek5dHJywsyZMwE8DJuPzsK7evUqwsLC4Obmhjlz5qCiogJr166FRCLBnj17cOjQIVy/fh2zZ8/G5s2bG90CkPn5+ejXrx/eeuutp/aeSqVS7Ny5U5w44O7uXmetoaOjIzZs2AB/f3/o6upi7Nix9d30Rm3VqlXYvXs3goKC6uy1lUqlqK6uhpmZGX777bca1x87dkxpNmeXLl0gCALGjh1bI0A9ys7ODqtWraqxXRHCBg4ciISEhEb3WqSXp5Ehq7y8HM7OzvDz88PixYvV3RyqBx9//DEAIDg4GP/9738hlUqVgsSDBw8gl8sxb948ccahIAgIDAxEp06dUF5eXmcwk8vlqKysVOtK7i/CyspKHN5MSUmpc7/y8nLxNDJNTdu2bcWaLEUdTEVFBczNzcUFITMzM8X9CwsL8eWXX0IqlWLSpEmwsLDAokWLxOvHjBmDkpISVFRU4OzZs8jPz8fEiRMb9kE9hUQigUQieeKX9qP7Pss2hSa+LKJKyWQy8TOiVatW+OSTTwA8XD7F0NBQHAl5vJ5NIpEgLS0Nu3fvrnWWbFRUFIKCgp543+wA0FwaGbKMjIywaNEiXLt2Td1Noec0Z84c5ObmYurUqVi/fn2N804qCkkVYmNjsW3bNuTm5sLPz09poc7CwkJUVVWhRYsWGDhwYI2TCvv6+or/trW1xcGDB2tt07Zt23Dq1ClERkY2ml6sp5HL5aiqqsLs2bMRExMDbW1tdOrUSd3Nqhfl5eX4+++/xaHjiooK8TqZTAZ3d3fcv39f3KYI1jKZrNaerMbGxMQEf/31F1577TVUV1fjX//6V537yuVyFBUVIS4uThwerStIpaamYsqUKVi5cmWz68UCHtY/FRUV4d///jc2btxYozertLQUhoaGsLKywtKlS7Fv3z7MnTsXCxcuFCfNZGdnY9SoUQgPD0d+fj5GjBgBfX19SKVSTJgwodawVF1dXWfd8ObNmxEdHY1Tp06xF0tDaUTI4q8zzSGRSDB16lRs2rQJN27cEAvf6+qJWrt2Lfr374/JkyeLH3ByuRwymQwXL17EgQMH4O7ujmPHjokFqoqarJCQEFhaWqKqquqJa6cdOXIEU6ZMUWs9FvB8r3OZTIaqqiqMHTtWPE9jU+upEwRBabhQISMjAyNGjBCHRjMzM/Hee+8BgHhi8NmzZysdq6KiAnK5HBUVFeLzXVFRUefzru7PlLZt28LNze2pa3VVVlbWqCeraw0nxSKsHh4e9dPIJuiDDz7AmjVrkJ6eXiNkZWdno3Xr1vjxxx8RERGBuXPnYs+ePTh//jx8fX3Ru3dv/Prrr3j33Xchk8lgbW0NS0tLeHl5oaqqCrt27XrunqzIyEiMHz+e9VgarMmHLAsLC5XMAiovL0dFRUWTHGJpyu7evYuBAwdi4sSJSmsEffjhh0hPT69RW1VWVoa0tDSl+glBEGBtbY3PPvtM3PakNbGkUukTa7YCAwPFkKWuGYZWVlbIzs5+5v3nz58PJycntG3bVvxS3bNnD44fP44ff/xRHPooLS1FZWWl2k4xYmJigoKCglqvk8lkSsOFimHgK1euYPTo0c91P3l5eQCgtGL+nj17AEBcR+9RhYWFaluFu7KyEmPGjEFubi6+++67J+577tw5REZG4sCBA1i9evUT9+3bty/8/f0xaNAgHDt2rMbsOk2XkpKCgQMHYurUqTUee3l5Oa5duwZHR0fIZDJMmjQJ6enpsLGxwaRJk9CtWze0aNECEydORLt27bBixQp4eHggMTERnp6ecHBwqHUpIAU7O7tat69cuRL//ve/0bJlS84w1FBNPmS5uLggNja23o+bkZGBdu3acY2sBjZnzhw4OTnVWCPrl19+qXX/Tz75BG+++SZ8fHxqXBcZGVkvbXJwcMDXX3+NCRMmYNSoUWpZK6tLly5PPJGzgYEBLly4gKysLBgZGWHQoEEAHtaqAQ+DZ2JiIu7cuaM0y/bWrVtwcnJSyxpZAGBtbY0HDx6gpKSkxuzfR1clt7KyQnh4ONLS0nDlyhWl5TjkcnmNYRpBELBkyRJIpVIYGRkhMTER5ubmOHbs2DMNF2ZkZOC1116rx0f67LKzs3H06FGsX7++1t7HR4dHa5Oeno78/HzI5fIatx88eDB+++03HDp0qNmFLMWJ1WtbIysqKgqWlpYwNTXFtm3bMHnyZAQGBmL27NmQyWT48ssvsWHDBty9excrVqwQl4DYsWMHNm/ejB07dmD79u3o3r07+vbti48++giLFy8WZzFevXoVP/zwA2bOnKn0WrW2tsaCBQswZcoUTJo0SaNmANNDTf60Op06darz9ChyuVzs9q+t+7+4uBhpaWm4d+9ejQ/ptLQ0dO7cuf4bTE/0xRdfID4+Hn/++ecz7f+kYR1BEFBRUYGCggIUFxeLl9LSUgAPe3Ee3V5QUFDree3y8vKwcuVKBAQEqG0xUhcXF9y6davO699++21UVlZi5MiR8Pb2rnEZMGAAYmJilOrZgIfn/lTn61wikcDJyanWx9alSxfs2rVL3E9XVxfr169Hv379xKHbhIQEzJ8/H+bm5kq3ra6uxqJFi7Bx40a4uLhgx44d8Pb2rnEfdb1+bt26BWdn55d9eC/ExsYGBw4cwPz58xEXF1fj+qedEufcuXOYNGkShg0bBjMzM3F7SUkJZsyYgV69emHevHn13u7GbtmyZUhOTsavv/6qtL2iogLr1q3D0KFDsXnzZmhra6Nnz57Q19eHXC7H+++/j6+++grJycnYtm0bunfvjuvXr8PZ2RmXL1/G2bNnoaenh0uXLuHOnTuQSCT44IMPIJPJEBMTg9mzZ8PKygrR0dE11uG7desWlixZguDgYAYsDdXku2k6d+6M1NRUCIJQIyhVVlaKJ4dWfLE+6u7du3jvvfdgampa4wTTqampzXItGXXr1q0bjh8/jkGDBsHGxqbO5yAmJgahoaFISkrC+++/X+s+xcXFiI2NhZ+fX41aLiMjoxq1LFVVVZDJZIiMjFQaXvz888/x1ltvKc1Sa2iurq64fv06ZDJZrQWyjo6OtU45f5pr166he/fu9dHEF+bs7Iy0tDS4uroqbZdKpUrDmLm5ucjNzcWCBQvEbS4uLujWrVuN4cMRI0bAxsYGlpaW8PT0xLFjx7By5UoAD5dz0dPTw4kTJ3DgwAHMmTNH6bbV1dVqDVnAw7XZJkyYgE2bNtU4r11ISMgTb+vr64vXX3+9xg+C8PBw3L59G+Hh4c2yh75du3aIiIhA165d0blzZ/H8hdra2nB1dcXIkSMREBCAwMBASKVS9OrVC4sXLxYn3+Tn5+Mf//gHrl69iq+//hpt2rSBVCrF0KFDATw8RdXGjRvFYWjgYa/kkCFDYGxsjB9//BHR0dFKbZozZw5mzpwpzp4mzSMR1F3h+ZIEQYCTkxMCAgJqfEgrTuT5pEVIMzIyYGNjUyOgjRs3Dhs3blSarUYNY8uWLQgICMCWLVvQtm3bWve5desWdu3aBVdXV/j6+tb6pfGstSpPs2zZMuTm5uLIkSNq/bXp5eWF0aNH19trsrq6Gn5+fjh58mSNHxkNacOGDTh8+DCWLl2qsvvIzMysUWOVk5ODnJycGj15cXFxCAoKUuuJszds2IClS5di/fr1Tz159rO+zquqqrB06VIUFhbiyJEjza7eVBAEzJ49G8eOHcP69etfqA6xrKwMQ4cORVhYGPT09PDNN9+gY8eOePfdd1+oTdu2bcOxY8cQERGhthpAUq0mP1wokUgwYcIEbN++vUY3uqIe40lsbW1rBKzw8HCUlpbWOrxAqrVz504sWrQIQUFBaNu2LQoLC5VOhltdXS2eUHjBggX4xz/+gczMTKUZVXl5eUpF4jKZDKmpqUr3c/PmTbGXE3j4hZubmyv+XV5eLq4a/8UXX6Bly5YYOXLkU4dqVGnGjBkICgrC5cuXX3r2W35+PlatWgUXFxe1Bizg4dpVZ86cwd27d1V2H7V9gVlYWNQIWHK5HPv27av1vJkN5ebNm/D398eqVavg4OCABw8eYOHChQgKChKf95ycHEyfPl3p1EC3bt3C5MmTlYbaL168iI8//hjx8fGQSqUICAhAcXFxjVP1NAfLli1TClgpKSlK9bwlJSU4fPiw+B4XBAFhYWFKnz8hISGwsbERe7qdnJwQGhoKuVwu3iY0NFTpsyQxMRGXL18W/87OzsaJEycgCAImTpyI119/Hd7e3kqfR6Q5tBdrwGqdffr0wcGDBxEYGIi7d++ipKQEMpkMLVq0eOq6RlVVVcjIyMDly5dx6tQprFu3DsePH8f//ve/OmeEkOrs3LkTeXl5GD16NIqKijB58mTs2rULHh4eMDc3x3fffYfly5dDX18fPXr0wKlTpzBlyhRcvHgRQ4YMQU5ODiZNmoR9+/ahY8eOSE9Px5kzZ7By5UqYm5vDxcUFhw8fxvTp05GSkoLXXnsNt2/fxqRJk/D7779jwIAB0NfXx9y5c7Fu3TrY2dmhY8eOKCwsxNGjRzF9+nS1DbW4urpCV1cXy5Ytw2+//YYrV64gJSUFWVlZqKioQGVlJYqKimpccnNz8ffff+PMmTMIDQ3Fzp07ERQUhC5dumDbtm1qrwUxMDBAy5YtMXXqVCQmJiItLQ2lpaXiEgs6Ojr1/v+8uroaRUVFuHfvHm7cuIHTp09j//79WL9+PVq0aIG1a9eqbU00ExMTZGVl4ZdffoG7uzs+//xzdOzYEUlJSbhw4QLat28Pf39/DB06FAcPHkReXh7y8/Px66+/4r333sP69ethYGCA/Px8LFiwAB999BGWLl0KBwcHREVFISEhAUFBQTXWoNN0Fy9eRGRkJIYPH447d+5g6tSpCA8PR5s2bWBtbY2ZM2fi5MmTuHHjBry9vbFt2zb89NNPOH78OAYPHozk5GQEBASgqKgIzs7OMDU1xYoVK5CcnIzCwkJ4eXlhzZo1+PXXX3Hy5EkMGTIECQkJWLhwIY4dOwZXV1fo6enh3//+N06fPo2ioiK4u7sjPDwchYWF+OSTT9Q2AYVUp8kPFz7q+vXr2Lt3L86fP4/k5GSkpqZCX1+/zhPQVlZWIisrC1ZWVujQoQM6deoEPz8/DB48mAvDqUlVVRXGjx+PtLQ05Ofn4+2334a7uzsmTZoEDw8P5OXlYfv27Rg+fDg8PDwQHh6Oo0eP4vvvv8fdu3eRkZGBqVOnwsLCAjNmzIBUKkX37t2xZs0aDB06FP369cPp06dx4sQJzJ07F5WVlbh69SqWLFmCsrIyBAYGon379jA1NcWiRYswfPhwvPbaa4iMjMSpU6caxWQIxUzB+Ph4XL9+HdevX0dycjKKiopq3V8qlaJ9+/bo2LEjnJ2d4ezsjIEDB6o9XD0uMzMTZ8+exblz5xAXF4fMzEzk5uYiLy8PUqkUpqamMDU1hYmJCQwMDJ5rlezKykoUFhaioKAA+fn5KCoqQqtWrWBmZgYLCwt07doVvXv3hru7O9zc3Oo8xVJDEQQBU6ZMQXBwMGbNmoUVK1bgwYMHGDVqFCIiIrBq1Sr4+/sjKysLffv2RXp6Ovbu3YtRo0YhJSUFQ4YMQUlJCf744w94eXnh7NmzeOONN2BkZISIiIhaz93XHHz33XfYtGkTHjx4gPXr16Nz584YPHgw2rRpg1deeQUbNmzA66+/jqKiIjx48AB//fUXtmzZgm3btqGoqAjt27fH6NGjERgYCAsLCwwZMgS7d++GpaUltLW1IQgCIiIi8M033+Dw4cPIzc3FwYMHUVFRgbFjx8LExARjx47F9OnT0b9/f7Ro0QISiQQnT55UywnaSfU0KmQ9TrGYYWFhYa3X6+jowM7Orsms4t1cVFVVYfr06TA3N8fXX38NiUSCX3/9Fbt378b27dthYmKC1NRUTJ48GUuWLIGnpydkMhk+/fRTdOrUSVyvxt/fH/v370dycjIMDQ3x999/Y/r06Vi1ahV69OiBsrIyfPTRR+jfv7+4evjq1auRmJiIzZs3Q09PD+fOncO8efMQFBTUKAJWcyQIAkpKSsQaqpycHBQXFz/XMXR0dGBhYSFeTE1NG33xtyAIuHr1qtLkj8rKSty6dQsdO3YUt+3ZswfBwcFKw4R5eXmoqKiAlZWVuO3evXvQ1dVVmnHYHG3duhWmpqbiZIm4uDiEhoZi3rx5kEqlKCoqwrJlyzBlyhTY2dlBEARs2LABDg4OGDduHK5evYrr16+LMwdHjRoFPz8/cVmQNm3aQBAErF69Gr169RJrKE+cOIGrV6/C398fEokEmZmZ+PHHHzF//nwGLA2m0SGLmrdDhw4hODgYhw4dUndTiFSGr/OGkZSUBD8/vxrnCV2xYgXu3r2LH3/8UU0to8asyRe+ExERqdqZM2fg5eVVY7uXlxfOnDmjhhZRU8CQRURE9BRRUVFKp2VScHd3R1JSUq1rMRIxZBERET1FXT1ZLVq0QLdu3WpdnZ+IIYuIiOgJsrOzkZWVVWPBa4V+/fpxyJBqxZBFRET0BNHR0ejbt2+dS3t4eXkhKiqqgVtFTQFDFhER0RPUNVSo4OXlhejoaHHldyIFhiwiIqInqKvoXcHKygrGxsa4du1aA7aKmgKGLCIiojpUVFQgPj4evXv3fuJ+HDKk2jBkERER1SE+Ph7Ozs5o2bLlE/dj8TvVhiGLiIioDlFRUU+sx1JgTxbVhiGLiIioDk8relfo2rUr7t69i5ycnAZoFTUVDFlERES1EAThqUXvCtra2ujTpw+io6MboGXUVDBkERER1eLmzZvQ0tJCu3btnml/DhnS4xiyiIiIaqHoxZJIJM+0P4vf6XEMWURERLV41qJ3hT59+uDChQuorKxUYauoKWHIIiIiqsWzFr0rtGrVCh06dEBCQoIKW0VNCUMWERHRY4qKinDjxg307NnzuW7HIUN6FEMWERHRY2JiYvDKK69AR0fnuW7H4nd6FEMWERHRY5516YbHKXqyBEFQQauoqWHIIiIieszzFr0rODg4QBAE3Lp1SwWtoqaGIYuIiOgR1dXVOHv2LDw9PZ/7thKJhEOGJGLIIiIiesTly5dhbW0Nc3PzF7o9i99JgSGLiIjoES86VKjAnixSYMgiIiJ6xPOuj/W4Xr16ITk5GcXFxfXYKmqKGLKIiIge8aIzCxV0dXXRs2dPnD17th5bRU0RQxYREdH/d/fuXRQWFsLZ2fmljsMhQwIYsoiIiESKeiwtrZf7emTxOwEMWURERKKXLXpX8PT0xNmzZ1FdXV0PraKmiiGLiIjo/3vZoneF1q1bw9LSEklJSfXQKmqqGLKIiIgAlJWV4dKlS/Dw8KiX43l5eXHIsJljyCIiIgIQFxcHV1dXGBgY1Mvx+vXrx+L3Zo4hi4iICC+/dMPj2JNFDFlERESov6J3hc6dOyM/Px/37t2rt2NS08KQRUREzZ4gCPUesrS0tODp6Yno6Oh6OyY1LQxZRETU7CUnJ8PQ0BA2Njb1elwOGTZvDFlERNTs1dfSDY9j8XvzxpBFRETNXn0XvSt4eHggMTER5eXl9X5savwYsoiIqNmr73osBUNDQ7i4uOD8+fP1fmxq/BiyiIioWcvLy8Pt27fRrVs3lRyfQ4bNF0MWERE1azExMejduzekUqlKjs/i9+aLIYuIiJo1VRW9Kyh6sgRBUNl9UOPEkEVERM2aqoreFWxtbaGvr4+UlBSV3Qc1TgxZRETUbMlkMsTFxaFPnz4qvR8vLy/WZTVDDFlERNRsJSYmwsHBASYmJiq9Hxa/N08MWURE1GypeqhQgcXvzRNDFhERNVuqLnpX6NGjB27duoWCggKV3xc1HgxZRETUbDVUT5ZUKoWHhwdiYmJUfl/UeDBkERFRs3T79m1UVlbC0dGxQe6PTlflDQAAIABJREFUQ4bND0MWERE1S4qhQolE0iD3x+L35ochi4iImiVVna+wLn379sW5c+dQVVXVYPdJ6sWQRU1SeHg4JBIJJBIJtLS0YGNjA39/f5SVlYn77NmzB0ePHkVFRUWttzMxMcGwYcPYfU+NVlpamvh6lUgksLKywqeffori4mIAwPr16/Hhhx/iyJEjGDp0KG7evAmg5vvD1tYW8+fPh1wuV+fDaVCVlZVo2bIlvvnmG3HbwIEDIZFIoKurCycnJ+zZswfu7u4AgJkzZ8LV1VXpGLGxsZBIJLh48eIz3eeoUaPg6+urtG3Pnj2QSqXIz8/Hrl27UFZWBkNDQz5fzQRDFjVpGRkZuH//Pnbs2IEDBw4gICBAvC4uLg7V1dUIDw+vcbv09HSEhYXBxMQEgwYNwoULFxqw1UTPJyoqCrm5uTh48CBiYmLw+eefY//+/Zg1axbGjx+PAQMGQEtLC35+fkpfzBkZGcjLy8PevXvx008/ITg4WI2PomFFRESgpKQEISEhStv9/f2RkpKCL774Avfv38e6desAAG+88QaSkpJw9+5dcd+TJ0/C1tYW3bt3f6b7fOONNxAZGQmZTKZ0DE9PT5w6dQqzZs1C//79MW/ePD5fzQRDFjVpxsbGaN26NQYPHoyxY8ciNjYWAJCbm4vr16+jdevWNT5kAcDU1BSvvPIKdu/eDVdXVwQGBjZ004meWcuWLWFmZoY+ffpg9uzZ+P333xEcHIx33nkHgwYNgqGhIYKCgnD58mXxPQA8fH+YmJjA09MT3t7eiI6OVuOjaFghISEYNmwYYmNjkZ2dLW7X09NDu3bt4OTkhE6dOuHAgQO4du0avL290bJlS5w8eVLcNywsrEbP1JP4+PigtLRU6TlQHEPxfE2YMAHXr1/n89VMMGSRRrh37x7CwsLQqVMnAEBoaCjatGkDGxubWkOWgkQiwciRI1mMSk2Grq4uZDIZEhIS0LNnT3G7k5MTjIyMkJiYWOM2aWlpOHPmDNzc3BqyqWoVEhKCcePGwd7eHqGhoTWuP3PmDHx8fCCVShEVFQUdHR0MHToUf/75JwCgoqICZ86cea6QZWVlhZ49e4rHSE9PR0pKCnx9fcXnS1H8zuereWDIoibN1tYWxsbGsLGxgb29Pb799lsAwOHDh+Hq6gozMzOkpqbi6tWrTzzG/fv3G6rJRC8sKysLmzdvxtChQ5GbmwtTU1Ol601MTJCbmyv+bWtrCxMTE7Rv3x69e/fGtGnTGrrJanHt2jWkpKTA29sb3t7etf7QioqKgre3N1q3bi2+/319fREWFiZeL5fLMXjw4Oe670ePERYWBjs7O3Tr1k18vpycnFBWVoaMjAw+X80AQxY1aVFRUfjvf/8LQRCwcuVKWFhYoLq6GseOHUOXLl1gYGAAOzs7HDlypM5jNNT0baIX5eXlhVatWsHKygq6urpYs2YNJBIJBEFQ2k8ulyu9nqOionD+/Hns3bsX0dHRWLVqVUM3XS1CQkJgZ2cHe3t7vPrqqzh+/Diqq6vF6+VyOaKjo+Hp6an0/8vHxwcZGRlITk5GWFgYBg4cCAMDg+e6b19fX8TExKC0tBRhYWHw8fEBAPH5kkgk4smi+XxpPqm6G0D0Mtq1a4cuXbrAzc0N69atw9q1axEVFYX8/Hxs2bIFVVVVEAQBISEhmDVrVq3HyMzMhJWVVQO3nOjZ7du3D506dUKbNm3QokULAICFhQXy8/NhaWkp7ldYWAhzc3Px73bt2sHIyAgdOnTAzZs3sXz5csydO7fB29/QQkJCkJmZCRMTE1RVVaG0tFSpJODKlSswNzeHmZkZsrOzxfd/27Zt8corr+DPP//EyZMn8c9//vO577t3794wNTVFZGQkTp06hU2bNgH4v+cLgBiy+HxpPvZkkUaYPn06tm/fjuLiYoSEhKBDhw5Yt24dvL29sW7dOpw+fRpFRUW13jYkJAQDBgxo4BYTPTtra2vY29uLAQsAevXqhfPnz4t/X79+HaWlpUp1Wo8SBEFp1pumKi4uxunTp/Hjjz8iISEBly9fhrOzs9KQoeJUOsePH0dVVRVeffVV8TpfX1/873//w7lz556rHktBIpFgxIgRWLNmDXJzc8XhxkefLy8vL4SFhfH5agYYskgjjB07FgYGBti2bRtCQkLg4+MDS0tLGBgYYMyYMaiursaJEyfE/fPz8xEfH4/3338fV65cwfz589XYeqLnN3nyZOzfvx8nT55EaWkp/P390bNnT3HdJ+Bhz1ZOTg7CwsKwbt26564vaooUQ4Njx46Fg4MDHBwc8Prrr4shq6KiAsePH4eOjg4+/PBDfPzxx0qn1VHUVDk5Ob3w6XZ8fX1x7NgxDBo0SBxuVDxfO3bsgKmpKZKSktC9e/dm/3xpPIGoCTp16pQAQCguLha3BQQECO3btxcACEePHhX++OMP4Y033hAEQRD69OkjTJw4UbwdAMHExET4xz/+IVy6dEldD4PoiW7evCkAqPM1umHDBsHCwkLQ0tIShgwZIqSlpQmCICi9ziUSiWBtbS18/PHHQlZWVkM2Xy0mTpwo9OnTR2nb0aNHBQDi5wMAwcHBQQgMDBSqq6uV9pXL5YKlpaUwa9asF25DQUGBoKOjI6xdu1Zp+4YNGwRbW1tBT09PMDY2Fn799VdBEJr386XpJILwWOUkkYY4dOgQgoODcejQIXU3hUhl+Dp/PllZWXB2dkZeXh60tNQ3mDN79myYm5tjwYIFamsDqR6HC4mIqNmIjo5G37591RqwAJ4surlgyCIiomZDUfSubo8u40CaiyGLiIiajTNnzsDLy0vdzUDbtm1hamqKa9euqbsppEIMWURE1CxUVFQgISEBffr0UXdTADzszTpz5oy6m0EqxJBFRETNwoULF+Ds7AwjIyN1NwXA/w0ZkuZiyCIiomYhKiqqUQwVKrD4XfMxZBERUbNw5syZRlH0ruDq6op79+4hJydH3U0hFWHIIiIijScIQqPrydLW1kafPn0QHR2t7qaQijBkERGRxrt58yakUinatWun7qYoYfG7ZmPIIiIijadYukEikai7KUpY/K7ZGLKIiEjjNbahQoU+ffrgwoULqKysVHdTSAUYsoiISOM1tqJ3hVatWsHJyQnx8fHqbgqpAEMWERFptMLCQqSmpsLNzU3dTakVhww1F0MWERFptLNnz8Ld3R06Ojrqbkqt+vXrx+J3DcWQRUREGq2xnK+wLooZhoIgqLspVM8YsoiISKM11qJ3BQcHB0gkEty6dUvdTaF6xpBFREQaq6qqCmfPnoWnp6e6m1IniUTC9bI0FEMWERFprMuXL8PGxgbm5ubqbsoTsfhdMzFkERGRxoqKimqUSzc8jsXvmokhi4iINFZjL3pX6NmzJ1JSUlBUVKTuplA9YsgiIiKN1diL3hV0dXXRq1cvxMbGqrspVI8YsoiISCNlZmaiuLgYnTp1UndTngmL3zUPQxYREWmkqKgoeHp6NrqTQteFxe+ahyGLiIg0UlMpelfw8vJCTEwMqqur1d0UqicMWUREpJGaStG7goWFBdq2bYu///5b3U2hesKQRUREGqesrAyXL1+Gu7u7upvyXDhkqFkYsoiISOOcO3cOXbt2hYGBgbqb8ly4XpZmYcgiIiKN01SWbngce7I0C0MWERFpnKZWj6XQuXNn5Ofn4969e+puCtUDhiwiItIogiA0uZmFClpaWvD09GRvloZgyCIiIo1y/fp1tGzZEtbW1upuygvhkKHmYMgiIiKNcubMmSbZi6XA4nfNwZBFREQapakWvSt4eHjg4sWLKC8vV3dT6CUxZBERkUZpqkXvCoaGhujSpQvi4uLU3RR6SQxZRESkMXJzc3Hnzh1069ZN3U15KazL0gwMWUREpDFiYmLQu3dvSKVSdTflpTBkaQaGLCIi0hhNvehdoV+/foiKioIgCOpuCr0EhiwiItIYTb3oXcHW1hb6+vpISUlRd1PoJTBkERGRRpDJZIiLi0Pfvn3V3ZR64eXlxaUcmjiGLCIi0ggJCQlwdHSEsbGxuptSLxRDhtR0MWSRRikrK8ONGzdqbC8vL691OxFpDk0ZKlRgT1bTx5BFGiUtLQ0DBw5ERUWF0valS5di/fr1amoVUf26cuUKpkyZUmP7yZMn8c0336ihReqza9cuFBUVAdCconeFHj16ID09Hfn5+QDAIvgmiCGLNIqLiwvc3Nzwn//8R9yWm5uLTZs2Yfr06WpsGVH9ad++PQ4ePIgLFy6I2wRBwNy5c+Hi4qLGljW83bt349ixYxAEQWkR0oyMDDW37OVJpVJ4eHggJiYGADBu3DiEh4ert1H0XBiySOMEBARg+fLlkMlkAIAffvgBo0ePhoODg3obRlRP9PX1MW/ePHz99dfitpCQEFRWVmLUqFFqbFnD8/b2RkREBNLT01FVVQVHR0fs27cPAwYMUHfTXtiff/6JX3/9FcD/DRnK5XKEhobC2dlZza2j58GQRRrH3d0dbm5uOHHiBCorK7Fp0yYsWLBA3c0iqleTJk1CXFwcbty4AUEQsHjxYgQEBEBLq3l9rA8YMAARERGIiopCv379kJiYiM8++wx79+5Vd9NemIODA2bMmIGIiAix+P3vv/+GmZkZrK2t1d08eg5Ne0lcojoEBARgxIgRaNWqFXuxSCMperN27twJQRCaZS8WAPTs2RO3bt1CWFgYunfvjjfffBNBQUHo1auXupv2wpycnLBr1y68++67CA0Nxblz53Dy5Mkm3TvXXEkEVtKRhurduzfi4uKQmprKkEUaqby8HDY2NigrK8PPP/+M0aNHq7tJavH666/j2rVraNWqFfz8/LB06VJ1N6lerF27Flu2bEFVVRVsbGzwwQcf4IMPPlB3s+g5NK9+ZWpWvvnmG4wbN44BizSWvr4+3n//fejp6TXLXiyFPn36IC0tDQ4ODkp1ak3d1KlT0bdvX5SVlSE2NpY9WU0Qe7KIiJqw6upqFBcXw8TERN1NUZuQkBB8+OGHuHHjBoyMjNTdnHpVWVmJrl274s6dOygtLVV3c+g5MWQRERE1YmlpaTh48CBmzJih7qbQc2LIoiYhKysLmZmZyMnJES/Z2dnif4uLi5/reDo6OmjdujUsLCzE/yourVu3hr29PaRSzgsh9RIEAcXFxcjNzUVOTs4Lvc4tLCxgbm4OMzMzvqYbsdjYWCxYsACrV69Gt27dAAD79u3D1q1bsXXrVtja2gIA1q1bh4iICGzduhUmJiYQBAFffvkl7t27hw0bNkBPTw+VlZXw9/eHpaUllixZAolEos6H1qwxZFGjVFZWhqCgIEREROD8+fMoLS2FtbU1TExMYGxsrHQxMTGBgYHBc32QyGQyFBYWoqCgAIWFheKloKAAubm5yM/PR7du3dC7d29MnjwZrq6uKny01JyVlJTgwoULiIuLw7lz58QfE7m5ucjLy4Ouri5MTU1f6nWen5+PwsJCtGzZEubm5jA3N0fr1q3RtWtXeHh4wN3dHfb29ip8lC+utLQUN27cQEpKClJSUsTVzx+no6OD9u3bw8nJCR07doSlpWWTCRexsbHw8fHBiBEjEBoaij/++AOXLl3CV199haFDhyIyMhInTpzAzz//jF27dsHNzQ03btzA0aNHsXDhQiQkJMDc3BwA8Msvv+CDDz5ARUUFsrOzMXz4cKxatarJ/L/QNPxZQ42OIAh44403IAgChg0bho8//hg2NjYN+iFRUlKCq1evIj4+Hq+++ipOnz7NoEX1bufOnfD394eDgwM6d+6MTp06wdvbGyYmJuIPCj09vXq5L0XtVkFBAQoKCpCXl4cbN25g3bp1uHz5Mry8vLB37956u7+XkZaWhi1btmDv3r1IT09Hu3btYGdnBxsbG7Rs2bLW28hkMsTHx+POnTtIT09HZWUlRowYgQkTJsDHx6eBH8Gzu3//PoYPH45FixbB29sbHh4e8PHxgZGRETZt2oR27drB0dERvXr1gr29PYKDg2Fqaor//Oc/cHJyQq9evbB+/Xro6uriu+++g729PYYNG4YlS5agtLQUn332GRwcHDBt2jR1P9RmiT1Z1OhcvHgRI0aMwIEDB6Ctra3u5mDr1q2QSCTYsGGDuptCGqSgoAD29vbYsmULOnTooNa2yGQyfP755xgzZozav4yTkpIwYMAAvP766xg6dChcXFxeaIHVnJwchIeHY/fu3Rg3bhyWLFmigta+vJKSEvTv3x/du3fHtGnTIJFIkJGRAUNDQ5iamor73bx5E23atIGhoaG47dq1a3B0dISOjg6Ahz9Qr1y5gs6dO0NLSwuXL1/G7Nmz8csvv2DYsGEN/tiIIYsaoa+++grp6elq/7BXuH37Nj755BPcv3+fXe5Ub7Zu3Yo9e/Zg+fLl6m4KACA6Ohrbtm3D+fPn1dqOsWPHom3bthg/fny9HC83NxfvvPMOUlNTxSG1xiYvLw+vvfYaPDw88Omnn9bLMZOTk+Hv749t27Zh5MiR9XJMen5cJ4sanfPnz6N79+51Xp+RkYHKysoGa4+dnR2qq6tx//79BrtP0nzHjx9Hv3796v24L/r+8PDwwJUrV567uL4+FRcX48iRI7WGguLiYpSXl+NZ+gWqqqpQVFQEADA3N0f//v2xe/fuem9vfTE2NkaXLl1w69atZ75NVVXVE6/PycmBVCpF586dX7Z59BIYsqjRuX79Ouzs7Oq8/ocffsDUqVMBPPwFGBQUhOrqapW2yd7eHtevX1fpfVDzcu3atSculLtlyxYEBARALpeL265evfrUYPai7w+pVKr21/mlS5dgb29f65pfM2bMQP/+/cVC/Sdd+vbti7Fjx4q37dmzJ86ePduQD+WZVVdXY+LEibhx4wYCAgJqXP/XX3/hvffeU9qWlJQEX19fZGVl1XlcT09PTJo0CYMGDUJKSkq9t5ueDQvfqVGpqqpCRkaGOF25tusTEhIwa9YsAA+/GH7//XeYmZlBIpEgKChIrOOaPn16va2CbWdnh+TkZHh7e9fL8ah5EwQBKSkpTwxZJ0+exJAhQ5TqkQwNDZ+4DMPLvj/s7e1x7do1vPLKKy/x6F5cUlISHB0da70uMDAQgiBAV1dXaXtISAjWrl2LPXv2wNjYGMDD4PLgwQNxn/bt2yM0NFR1DX8J6enp2LVrF3bt2gV9ff0a1+vr6ystsFpeXo6lS5eipKQEH330EQCgTZs22LhxY43/N35+fggJCcFPP/2EZcuWqfaBUK3Yk0WNyu3bt2Fubl7nDKfw8HBUVFTgtddegyAIMDQ0hL+/P3R0dDBy5EgcOXIE4eHh6N279zPdX3x8fI1fwbXNRLK2tmZPFtWbO3fuwNDQsM7VyePj45GZmYl3330XwMNenKysLGhraz+xLvBl3x92dna4cuXKyz/AF3Tp0qU6g6eZmRnMzc3RsmVL8aKtrY2dO3di5MiRsLW1FbebmJjA2tpavG2HDh1w9erVZxpqbGjt27dHUFAQZs2ahYyMDHG7YgHSs2fPIi8vDwcPHsT9+/exePFiODk54a+//sKhQ4fg4uKCd999t0bAksvl+Pbbb2FkZISFCxc29MOi/489WdSoPHjwAAYGBnVev3//frRu3RoGBgaIiYnBwoULERYWVuu+z7LwYnFxMWxsbLBz505xW21fYoaGhkq/jIleRmFhodjrUptdu3ahU6dOYgg7f/680pDf/fv3cezYMYSGhmLr1q3ie+Zl3x/GxsYoKCh4mYf2Um7fvg0PD49n3n/16tXIzs7GpEmTUF1dDS0trVrfvy1btoSWlhYKCgqUZuw1Fp9++inS0tKwZMkSBAcHA/i/zyG5XA5BEMRhYycnJ2RlZeH7779HVVUVIiMjYW5ujvj4eHz66afi6+rIkSM4f/48rly5ojQjkRoWe7KoyUhISEBsbKz4t5GR0Uufp6y4uLjGr2NNO/cZNS1JSUkIDw9X2qalpYXS0lJERkaitLQUY8aMQXx8PK5fvy4OJ6ri/aEOz7pcw+7du3Hw4EFoa2vDwsIC8+bNw6JFi+osCG/MM4Pj4+Px008/KdWR2dvb480334SnpyfMzc3x1ltvwdLSEunp6di/fz/27t2LAwcOoKqqCnv37sXevXuVzm3Yr18/tGjRAsuXL2+UPXjNBUMWNQlVVVVYuXIlPD09xW06Ojov/cGpmLH0wQcfoF+/fpg0aZJSlz1RQ5LL5Vi5cqU4uzYnJweHDx9GZWUlPvroI5w9exYtWrRAaGgoPv/8cwCAtra2yt4fjdX27duxYcMGzJw5U9w2evRonDp1CjNnzkR5ebkaW/d8srKyMHToUHz++ed47bXX6txP0aOlpaWFgIAAxMXFoVevXlixYgXi4uJgZWWltL+pqSk2bNiAPXv2YOPGjap+GFQHhixqEsrLy+Hs7CwWetaX4uJi3L9/H5988gl2796N6upqfPPNN/V6H0TPKjMzE+Xl5eJssuDgYJw4cQISiQS7du3CnDlzoKWlhRYtWojDhxKJRGXvj8YmNzcXs2fPxm+//YbNmzfDzc1NvK5v375Yt24dEhMTMX369CYzvK+vr482bdo8cQZgZmYmxo4di3v37tW47vFarEdlZ2ejoKDgibO1SbUYsqhJMDIywqJFi9CiRYt6Pe4///lPHDhwAP3794etrS3GjBmD8+fPN+g6XEQKtra22LFjhzjxY968eVizZg10dXXFVb0VHjx4AD09PWhra6vs/dGYbN26FW+99RYKCgqwY8eOWtd/6tmzJ9auXYukpCSxp6+xa9WqFcLDw3H69Gn89NNP4vby8nIcPXoUq1evRnV1NebOnQsrKyuUlZWJkxPKy8vrDFmpqamYNm0agoKCuBipGrHwnZq1x2tWjI2NIQgCSktLn/gLkUhVHi1Ir6s+acuWLdi+fTveeuuteh0SVHftjpaWVp01VW5ubpBKpRg3btwTJ7W4ubkhMDAQrVu3FrcJgoCqqqpGcZqu2lhYWKBPnz64evWquC0rKwtbt27FwIEDcenSJbi7u+Ott95CTk4OZDIZTp8+jaysLCxYsAAGBgYoKirC+++/jx9//BE9evRAZmYmpFLpM8+0JtVgyKJGxcTEpEFnN/3rX/9C//798fHHHwN42C3/+DnDgIezwR6veSB6UZaWlsjKyoIgCM8VkhR1OWPHjsU777zzxBmKLyInJwfOzs71eszn4eTkhNu3b9d6nWKJlWfRt29fpb9zc3Ohr69f58ml1Ukul+Ozzz5DYmIi1qxZI25v164ddu/ejYSEBFy6dAnAw9mjkZGROHDgAD788ENMmTIFRkZG2LdvX42ezv79+2P8+PEYOHAgIiIiYG9v36CPix7icCE1KtbW1igtLUVJSUmD3J+npyd+//13XLlyBcnJydi1axfeeuutGvtlZGSo9cuHNIuFhQW0tbWRn5//XLfT19fHO++8I64FlZqaiilTptTb++X27dtqPQ1L165dkZaW9sz7V1dXP9Nq9qmpqXBxcWmUEwHS0tKwZcsWzJs3r8ZSC3X12MnlcqxduxYfffQR3NzcsGnTplr3GzNmDMzNzVn4rkYMWdSoSCQSODo61jnDT/FLHqh9aKO4uBhpaWm4d+/eM32gTpw4Ed7e3pg2bRr8/f3Rr18/fPbZZzX2u337NkMW1auOHTvWGSiqq6uVXt+6urpITk6GgYEBPvzwQzx48AAPHjxAVFQUbt26JX45v+z7Iy0tTa0hy9XVFampqc+8f3FxMaqrq58aMlNTU9G1a9eXbZ5KODo6YtWqVfj8889rFLaXlpYiPz9fKWzl5OQgKSkJRkZGGDduHKZPn46wsDB89dVXSrcXBAHff/89pFIpFixY0GCPh5RxuJAaHcWXT20f9pWVlWJR+qNrwijcvXsX7733HkxNTdGlS5en3peuri7mzJmDOXPm1LmPIAi4desWOnbs+ByPgujJunTpgpSUFPTq1avGdTKZDBUVFeLfY8eORUBAQI0JGUZGRpg9e7YYmF7m/VFWVoa7d+/CycnppR/bi3J1dUVeXh4yMzOVVmyvi5eXF+Li4p66X1RUFPz9/eujiSoxc+ZMZGZmYvHixUq9UitWrMCff/6JuXPnoqysDLNnz0ZCQgLatm2LwMBAaGtrw8zMDFu3bsXixYsxYcIE/PbbbzA1NUVoaCiio6Nx+fJltGrVSo2PrnmTCOqudCR6TGBgIKKjo2s9FURVVRXKy8ufuMhiRkYGbGxsIJFIMHDgwDr38/f3x9tvv/3U9vz9999YsmQJT7JK9Wr//v34/vvvERQUVG/HfN73x6NCQ0MRERGB48eP11t7XoS/vz9ycnKe+MPneVy7dg3+/v64c+dOo519+ffff2Pw4MGYOnUqXn/9dXF7UVER9PT0xNmmly9fxq1bt/Dnn39i9erVNY7zaDjNycnBZ599ho8//pg9WWrEkEWNTnp6Onr06IGDBw++9IrVmZmZdV7XqlWrZzr+ihUr0KlTJyxduvSl2kL0qPLyctjb22P69OkYPHjwM50GShUEQcCdO3cwd+5cLF26FGPGjFFLOxSys7Ph7e0NIyMjDBkyBG5ubrC1ta315Mm1kcvlyMrKQkpKCiIiIhAeHo6NGzeK54FsbHJycuDq6oqpU6dixIgRAIDTp0/DwsICLi4uAB4+R8eOHUOXLl2QlpaGAwcOIDAwEIcPH0b//v1hYWEB4GFvZEhICHx8fGBgYICcnBx8+umnWLBgASZNmqS2x9icMWRRo+Tv748jR47g1VdfhYuLC1xcXGBpaVljBk19k8vlKCoqQkpKCpKSknDx4kWkpqbi7NmzaNu2rUrvm5qf2NhYTJ48GdeuXYOzszM6deqENm3awMTEpMZFcULk5yEIAsrKylBQUCBeCgsLUVBQgLy8PKSmpiIpKQmCIGDatGn48ssvG0VxeHl5OUJDQ7F7925cuHDquis2AAAQ8ElEQVQB6enpMDY2hp2dHUxMTGq9TWVlJe7cuYOMjAyYmZmhY8eO8PPzw5gxYxr1YpyFhYVwd3fH8OHD8a9//Qv//e9/ceDAAZSVlWHx4sXo27cvVq5cibi4OBQXF2P8+PE4e/Ys9PT0cPv2bVRUVGDdunVo2bIlZs2ahdLSUujr62P16tXIy8uDv78/Nm7cWOuEHlI9hixqlARBQGRkJE6fPo3Y2FhcuHAB9+/fR4sWLWBqagpjY2OYmJjA2NgYxsbGTzypdG1kMhmKiopQWFiIwsJC5Ofni18+BgYG6NKlC3r37g0PDw/4+fmxpoFUqqSkBPHx8Th//jzu3LmD7OxsZGdnIycnB7m5ucjNzUVxcTH09fWfKwTJZDJoaWnBzMwM5ubmsLCwgIWFBVq3bo3WrVujW7ducHd3h52dXaMIV3Wprq7GnTt3kJycjMLCwlr3kUqlaN++PRwdHZvcCZEzMzMxYMAAmJiYoLS0FCdOnEBaWhrefPNNODg4oEWLFjh06BBOnjyJCRMmAACGDx+OXbt2ITg4GN9++y1atmwJHx8f/PDDD5g3bx7+97//obS0FIGBgRg/fryaH2HzxZBFTYYgCCgsLEROTo54yc3NRU5ODoqLi5/rWDo6OrCwsFD64rGwsICZmRkXIaVGqaqq6rlPFaOjo9No65BIWWZmJtauXYu5c+fCzMwMAHDp0iXs3bsX8+fPF5/H5cuX4+eff8alS5fEns39+/cjOzsbn3zyiRiWt27dCjMzM/ZgqRlDFhERURNx6NAhBAcH49ChQ+puCj0DrpNFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFREREpAIMWUREREQqwJBFRESkZqNGjYKvr6/Stj179kAqlSI/Px/r169Hu3bt8PbbbyMmJgY3b94EAISHh0MikUAikUBLSwu2traYP38+5HK5Oh4GPYYhi4iISM3eeOMNREZGQiaTidtOnjwJT09PnDp1CrNmzcK3336LtWvXQiKRwM/PTylIZWRkIC8vD3v37sVPP/2E4OBgdTwMegxDFhERkZr5+PigtLQUsbGx4rawsDD4+voiODgY77zzDsaPHw9ra2t07doVly9fVtrX2NgYJiYm8PT0hLe3N6Kjo9XxMOgxDFlERERqZmVlhZ49e+LPP/8EAKSnpyMlJQW+vr5ISEhAz549xX0NDQ1hZGSExMTEGsdJS0vDmTNn4Obm1mBtp7oxZBERETUCvr6+CAsLA/CwF8vOzg7dunVDbm4uTE1NlfY1MTFBbm6u+LetrS1MTEzQvn179O7dG9OmTWvQtlPtGLKIiIgaAV9fX8TExKC0tBRhYWHw8fEBAEgkEgiCoLSvXC6HRCIR/46KisL58+exd+9eREdHY9WqVQ3adqqdVN0NICIiIqB3794wNTVFZGQkTp06hU2bNgEALCwskJ+fr7RvYWEhzM3Nxb/btWsHIyMjdOjQATdv3sTy5csxd+7cBm0/1cSeLCIiokZAIpFgxIgRWLNmDXJzczF48GAAQK9evXD+/Hlxv5KSEpSWlirVaT1KEASlWYqkPgxZREREjYSvry+OHTuGQYMGwcDAAAAwefJk7N+/Hzt27EBmZiYuX76Mnj17wt3dXbxdYWEhcnJyEBYWhnXr1okBjdSLw4VERESNxLBhw6CjoyPWYwHAyJEjsWbNGixcuBD379+HsbExDhw4oFSTZWtrC4lEAisrK/j4+GDZsmXqaD49RiI8Xk1HREREjdKhQ4cQHByMQ4cOqbsp9Aw4XEhERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrAkEVERESkAgxZRERERCrA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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "relation_dict = search_find_dict([find_head(den_parsing_list)],den_parsing_list, word_list)\n",
    "start = word_list[find_head(den_parsing_list)]\n",
    "plottree.createPlot(start, relation_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "# 输入主语第一个词语、谓语、词语数组、词性数组，查找完整主语\n",
    "def get_name( name, words, property, ne):\n",
    "    index = words.index(name)\n",
    "    cut_property = property[index + 1:] #截取到name后第一个词语\n",
    "    pre=words[:index]#前半部分\n",
    "    pos=words[index+1:]#后半部分\n",
    "    #向前拼接主语的定语\n",
    "    while pre:\n",
    "        w = pre.pop(-1)\n",
    "        w_index = words.index(w)\n",
    "\n",
    "        if property[w_index] == 'ADV': continue\n",
    "        if property[w_index] in ['WP', 'ATT', 'SVB'] and (w not in ['，','。','、','）','（']):\n",
    "            name = w + name\n",
    "        else:\n",
    "            pre = False\n",
    "\n",
    "    while pos:\n",
    "        w = pos.pop(0)\n",
    "        p = cut_property.pop(0)\n",
    "        if p in ['WP', 'LAD', 'COO', 'RAD'] and (w not in ['，', '。', '、', '）', '（']):\n",
    "            name = name + w # 向后拼接\n",
    "        else: #中断拼接直接返回\n",
    "            return name\n",
    "    return name\n",
    "\n",
    "# 获取谓语之后的言论\n",
    "def get_saying(sentence, proper, heads, pos):\n",
    "    # word = sentence.pop(0) #谓语\n",
    "    if '：' in sentence:\n",
    "        return ''.join(sentence[sentence.index('：')+1:])\n",
    "    while pos < len(sentence):\n",
    "        w = sentence[pos]\n",
    "        p = proper[pos]\n",
    "        h = heads[pos]\n",
    "        # 谓语尚未结束\n",
    "        if p in ['DBL', 'CMP', 'RAD']:\n",
    "            pos += 1\n",
    "            continue\n",
    "        # 定语\n",
    "        if p == 'ATT' and proper[h-1] != 'SBV':\n",
    "            pos = h\n",
    "            continue\n",
    "        # 宾语\n",
    "        if p == 'VOB':\n",
    "            pos += 1\n",
    "            continue\n",
    "        # if p in ['ATT', 'VOB', 'DBL', 'CMP']:  # 遇到此性质代表谓语未结束，continue\n",
    "        #    continue\n",
    "        else:\n",
    "            if w == '，':\n",
    "                return ''.join(sentence[pos+1:])\n",
    "            else:\n",
    "                return ''.join(sentence[pos:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "path = r'E:/MYGIT/Project/ltp_data/cut_external_dict/cut_external_dict'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "with open(path, encoding='utf-8') as f: \n",
    "    with open('pos_external_dict','w', encoding= 'utf-8') as output:\n",
    "        line_str = f.readline()\n",
    "        while line_str!= '':\n",
    "            name = line_str.strip('\\n')\n",
    "            output.write(name + ' nh'+ '\\n')\n",
    "            line_str = f.readline()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "## 确定言论结束"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "Sentence Embedding-基础词向量的句子向量化处理"
   ]
  },
  {
   "attachments": {
    "%E5%9B%BE%E7%89%87.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "![%E5%9B%BE%E7%89%87.png](attachment:%E5%9B%BE%E7%89%87.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Design Software\\Anaconda\\envs\\py36\\lib\\site-packages\\gensim\\utils.py:1197: UserWarning: detected Windows; aliasing chunkize to chunkize_serial\n",
      "  warnings.warn(\"detected Windows; aliasing chunkize to chunkize_serial\")\n"
     ]
    }
   ],
   "source": [
    "from gensim.models import word2vec\n",
    "from gensim.models import Word2Vec\n",
    "from gensim.models.word2vec import LineSentence\n",
    "from gensim.models import KeyedVectors\n",
    "from gensim.test.utils import datapath\n",
    "from collections import defaultdict\n",
    "import logging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Design Software\\Anaconda\\envs\\py36\\lib\\site-packages\\smart_open\\smart_open_lib.py:398: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function\n",
      "  'See the migration notes for details: %s' % _MIGRATION_NOTES_URL\n"
     ]
    }
   ],
   "source": [
    "fname = r\"E:/MYGIT/model/wiki_stopwords/wiki_word2vec.kv\"\n",
    "#model_wv.save(fname)\n",
    "model_wv = KeyedVectors.load(fname, mmap='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.memmap"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(model_wv['好看'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "500"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_wv.vector_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "def get_sentences_vec(model, sent_list, word_frequence):\n",
    "    # 词向量加权部分\n",
    "    a = 0.001\n",
    "    row = model.wv.vector_size\n",
    "    col = len(sent_list)\n",
    "    sent_mat = np.zeros((row, col))\n",
    "    for i, sent in enumerate(sent_list):\n",
    "        # new_sent = rm_spec(sent)\n",
    "        new_sent = sent\n",
    "        if not new_sent: continue\n",
    "        sent_vec = np.zeros(row)\n",
    "        for word in new_sent:\n",
    "            pw = get_wd_freq(word)\n",
    "            w = a / (a + pw)\n",
    "            try:\n",
    "                vec = np.array(model[word])\n",
    "                sent_vec += w * vec\n",
    "            except:\n",
    "                pass\n",
    "        sent_mat[:, i] += sent_vec\n",
    "        sent_mat[:, i] /= len(new_sent)\n",
    "\n",
    "    # PCA处理\n",
    "    sent_mat = np.mat(sent_mat)\n",
    "    u, s, vh = np.linalg.svd(sent_mat)\n",
    "    sent_mat = sent_mat - u * u.T * sent_mat\n",
    "    return sent_mat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    ">>> data = np.mat([[1,2,3],[4,5,6]])\n",
    ">>> U,sigma,VT = np.linalg.svd(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "sss = data - U*U.T*data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sent_vec = np.zeros(10)\n",
    "sent_vec.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 得到人物以及其对应的观点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用Flask等web框架展示项目成果"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "273.2px"
   },
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
